在新的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
方法花费多长时间,另一个线程会看到空的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变量将由多线程访问。
最佳答案
这正是应该使用ConcurrentHashMap的时间
private final ConcurrentMap<String, Function> functionMap = new ConcurrentHashMap<>();
public Function getFunction(String key) {
Function function = functionMap.get(key);
if (function == null) {
function = new Function(key);
Function oldFunction = functionMap.putIfAbscent(function);
if (oldFunction != null) {
function = oldFunction;
}
}
return function;
}