黑马程序员技术交流社区

标题: 为什么ThreadLocal里面存入饿汉式单例,结果就出错了? [打印本页]

作者: wnmmp    时间: 2014-8-9 16:38
标题: 为什么ThreadLocal里面存入饿汉式单例,结果就出错了?

       《张孝祥高新技术视频》里面关于ThreadLocal一节的示例源代码ThreadLocalTest.java,当设置的共享变量为MyThreadScopeData类时,为什么应用懒汉式单例结果可以实现数据共享,而改成饿汉式就出错了呢?PS,为了演示方便,把B类关了。
       懒汉式数据共享,两个线程的data各自共享:
  1.         private MyThreadScopeData() {
  2.         }

  3.         public static MyThreadScopeData getThreadInstance() {
  4.                 MyThreadScopeData instance = map.get();
  5.                 if (instance == null) {
  6.                         instance = new MyThreadScopeData();
  7.                         map.set(instance);
  8.                 }
  9.                 return instance;
  10.         }
  11.         private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
  12. //        结果如下
  13.         /*        Thread-0 has put data :633291546
  14.         Thread-1 has put data :-1541764721
  15.         A from Thread-1 get data :-1541764721
  16.         A from Thread-1 getMyData: name-1541764721,-1541764721
  17.         A from Thread-0 get data :633291546
  18.         A from Thread-0 getMyData: name633291546,633291546*/
复制代码



      改为饿汉式后,Thread-1在调用A类方法输出的data跟之前不一样了:
  1.         private MyThreadScopeData() {
  2.         }

  3.         public static MyThreadScopeData m = new MyThreadScopeData();
  4.         private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();

  5.         public static/* synchronized */MyThreadScopeData getThreadInstance() {
  6.                 map.set(m);
  7.                 return map.get();
  8.         }
  9. //        结果如下
  10. /*        Thread-1 has put data :1964655262
  11.         Thread-0 has put data :-49614189
  12.         A from Thread-1 get data :1964655262
  13.         A from Thread-1 getMyData: name-49614189,-49614189
  14.         A from Thread-0 get data :-49614189
  15.         A from Thread-0 getMyData: name-49614189,-49614189
  16. */
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2