ThreadLocal线程内单例跨线程调用测试

来源:互联网 发布:星际战甲漂亮捏脸数据 编辑:程序博客网 时间:2024/06/09 16:05
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/07/22/ThreadLocal线程内单例跨线程调用测试/

   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线程内单例跨线程调用测试/

0 0
原创粉丝点击