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]