ThreadLocal我们都知道依靠线程为Key来维护每个线程一个副本,保证线程内单例,确保线程安全,但是如果从ThreadLocal中拿出该线程内单例之后人为地把它放到另一线程呢?(显然,不人为这么做,JDK本身是保证了该单例仅在本线程内使用的,不会出现我说的这种问题的,我的这种问题仅仅是突发奇想测试一下哈哈哈)。
上代码:
public class ThreadlocalTest {
static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public static void main(String[] args) { threadLocal.set(Thread.currentThread()); final Object main = threadLocal.get(); System.out.println(main); new Thread(new Runnable() { @Override public void run() { threadLocal.set(Thread.currentThread()); Object name = threadLocal.get(); System.out.println(name); ((Thread)main).setName("main1"); System.out.println(main); } }).start(); } }
代码内容很好理解,在main线程从ThreadLocal得到线程实例,在子线程中调用这个实例main,并修改名称为main1,子线程自己也放入一个实例,输出结果如下,很明显,在子线程中修改main线程中的实例main成功。
运行结果:
事实说明,ThreadLocal维持的每个线程一个唯一副本,在线程内部单例,但是如果把取出来的这个对象引用人为地拿到另一线程使用,还是可以的,因此ThreadLocal不会拒绝你跨线程使用线程内部单例,支持给你提供线程内部单例的前提,要保证线程安全的程序,还是要程序员人为地注意这一点,保证该单例只在本线程内部使用,相当于是契约式编程吧,可以这么理解。
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/07/22/ThreadLocal线程内单例跨线程调用测试/
