volatile关键字我有下面的代码:线程安全
public class Foo {
private volatile Map<String, String> map;
public Foo() {
refresh();
}
public void refresh() {
map = getData();
}
public boolean isPresent(String id) {
return map.containsKey(id);
}
public String getName(String id) {
return map.get(id);
}
private Map<String, String> getData() {
// logic
}
}
- 是上面的代码线程安全的或者我需要添加或互斥在那里?如果它不是线程安全的,请说明原因。
而且,我读过,应该使用AtomicReference
,而不是这个,而是在AtomicReference
类的来源,我可以看到,用于保存值的字段是挥发性的(少数方便的方法沿)。
- 是否有具体原因使用
AtomicReference
代替?
我读过与此有关的多个答案,但volatile的概念仍然让我困惑。提前致谢。
你应该使用'ConcurrentHashMap'进行实例化。在这种情况下,volatile(或原子引用)在这里是无用的。 – dehasi
它不是线程安全的,虽然对Map类的引用是不稳定的,但数据不是 – nafas
@nafas但我从不修改地图对象本身。我一直在更新参考。 – GurV