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