黑马程序员技术交流社区
标题:
为什么ThreadLocal里面存入饿汉式单例,结果就出错了?
[打印本页]
作者:
wnmmp
时间:
2014-8-9 16:38
标题:
为什么ThreadLocal里面存入饿汉式单例,结果就出错了?
《张孝祥高新技术视频》里面关于ThreadLocal一节的示例源代码ThreadLocalTest.java,当设置的共享变量为
MyThreadScopeData类时,为什么应用懒汉式单例结果可以实现数据共享,而改成饿汉式就出错了呢?PS,为了演示方便,把B类关了。
懒汉式数据共享,两个线程的data各自共享:
private MyThreadScopeData() {
}
public static MyThreadScopeData getThreadInstance() {
MyThreadScopeData instance = map.get();
if (instance == null) {
instance = new MyThreadScopeData();
map.set(instance);
}
return instance;
}
private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
// 结果如下
/* Thread-0 has put data :633291546
Thread-1 has put data :-1541764721
A from Thread-1 get data :-1541764721
A from Thread-1 getMyData: name-1541764721,-1541764721
A from Thread-0 get data :633291546
A from Thread-0 getMyData: name633291546,633291546*/
复制代码
改为饿汉式后,
Thread-1在调用
A类方法输出的data跟之前不一样了:
private MyThreadScopeData() {
}
public static MyThreadScopeData m = new MyThreadScopeData();
private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
public static/* synchronized */MyThreadScopeData getThreadInstance() {
map.set(m);
return map.get();
}
// 结果如下
/* Thread-1 has put data :1964655262
Thread-0 has put data :-49614189
A from Thread-1 get data :1964655262
A from Thread-1 getMyData: name-49614189,-49614189
A from Thread-0 get data :-49614189
A from Thread-0 getMyData: name-49614189,-49614189
*/
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2