我有以下代码:

class SomeClass {
    private Map<String, String> someMap = null;

    public String getValue(String key) {
        if (someMap == null) {
            someMap = initialize(); // initialize() is some method which returns a proper map.
        }
        return someMap.get(key);
    }
}

假设我不关心someMap初始化一次以上,是否还有其他线程安全问题需要在这里关注。

根据what-operations-in-java-are-considered-atomic,引用分配当然是大气的。是对someMap的赋值是否保证在对initialize()的方法调用之后发生(对我来说似乎很合理)。线程是否有可能看到部分构造的someMap。是否有其他类型的对象而不是 map 有关系吗?

最佳答案

该代码是而不是线程安全的。如果两个线程在同一个对象上调用方法getValue,则一个线程可能看到部分创建的someMap

为了避免此问题,您必须删除数据竞争。最简单的解决方案是将someMap声明为volatile。要记住的简单规则是:如果代码不包含数据争用,那么所有执行将看起来是顺序一致的。

关于java - 使用方法调用的引用分配中的线程安全问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23813812/

10-10 19:30