我有以下代码:
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/