您的位置:首页 > 其它

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

2016-12-04 00:35 190 查看
本文为博主原创,允许转载,但请声明原文地址: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线程内单例跨线程调用测试/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: