agapple 发表于 2013-1-31 01:59:13

Object obj = new Object()引出的线程安全思考

背景

上次在部门周会上抛出了一段代码:
 
Class SimpleCache {   private Map cache = new HashMap() ;    public Object get(String key) {      return cache.get(key);   }   public void reload(){      Map tempCache = loadFromDB();       cache = tempCache; // 位置1,引用切换   }}是否是一个线程安全问题的操作。看似很简单的问题,其实发现自己也很难理的清楚,自己也是"道听涂说"的抛出了问题。
这里的关键点是在对应的位置1上,多线程中进行了一个引用切换,这是否是一个线程安全的操作??
 
因为jvm中的引用是基于双字节进行存储,会不会出现写了高位后,线程被换出,另一个线程读到了一个破损的地址导致程序出现异常?
过程

也没有绝对的标准,自己也试着去尝试分析一下这个问题。
 
首先看一下,jvm的内存模型:   http://kenwublog.com/explain-java-memory-model-in-detail
比较认可里面提到的几个内存模型的特征: 
 

[*]Visibility 可视性
[*]Ordering 有序性
这里也给出了对应jmm规范中,对应的工作模式:
页: [1]
查看完整版本: Object obj = new Object()引出的线程安全思考