在新的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;
}

07-24 19:34