在新的 Java 内存模型中,对变量的任何写入都保证在下一个线程读取它之前完成。
我想知道作为该对象成员的变量是否也是这种情况。
对于java内存模型:
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
例如
public class VolatileTest {
private volatile Map<String, Function> functionMap = new HashMap<>();
public Function getFunction(String key) {
Function function = this.functionMap.get(key);
if (function == null) {
//Is this guaranteed to be fully constructed? I don't think so.
function = new Function(key);
this.functionMap.put(key, function);
}
return function;
}
}
和上面的代码一样,即使设置了functionMap
volatile,也不能保证函数对象在这个方法返回之前就已经完全构造好了。
我的想法对吗?
也只是为了这个话题,我想让你们检查一下我的想法是否适合以下内容:
像下面的任何写入functionMap
保证在更改引用之前完成functionMap
,对吧?无论initializeMap
方法需要多长时间,其他线程要么看到 null 要么看到functionMap
完全初始化的functionMap
?
public Map<String,Function> getFunctionMap (){
Map<String, Function> tempMap = new HashMap<>();
initalizeMap(tempMap); //fill in values
// Above operation is guaranteed to be completed
// before changing the reference of this variable.
this.functionMap = tempMap;
// So here you will either see a null or a fully initialized map.
// Is my understanding right?
return this.functionMap;
}
上面澄清一下,上面两个例子都是在多线程环境下,functionMap变量会被多线程访问。