静态ConcurrentHashmap是否需要外部同步

Vis*_*hal 4 java synchronization concurrenthashmap

静态ConcurrentHashmap是否需要使用同步块或锁进行外部同步?

Nat*_*ate 5

是和不是。这取决于你在做什么。ConcurrentHashMap 对于它的所有方法(例如 get 和 put)都是线程安全的。但是,对于非原子操作来说,它不是线程安全的。这是执行非原子操作的方法的示例:

public class Foo {
    Map<String, Object> map = new ConcurrentHashMap<String, Object>();

    public Object getFoo(String bar) {
        Object value = foo.get(bar);
        if (value == null) {
            value = new Object();
            map.put(bar, foo);
        }
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的缺陷是两个线程调用可能getFoo会接收不同的对象。请记住,在处理任何数据结构或类型时,即使像简单的数据结构或类型一样int,非原子操作始终需要外部同步。诸如 AtomicInteger 和 ConcurrentHashMap 之类的类有助于使一些常见操作成为线程安全的,但不能防止诸如上面的检查然后设置操作getFoo