A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区


       《张孝祥高新技术视频》里面关于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. */
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马