我有以下代码:

public class Cache {

    private final Map map = new ConcurrentHashMap();

    public Object get(Object key) {

        Object value = map.get(key);
        if (value == null) {
            value = new SomeObject();
            map.put(key, value);
        }

        return value;
    }
}

我的问题是:
映射的putget方法是线程安全的,但是由于整个块未同步-多个线程可以两次添加同一 key 吗?

最佳答案

从不同的线程调用它们不会破坏数据结构的意义上,putget是线程安全的(例如,使用普通的java.util.HashMap可能是)。

但是,由于该块未同步,因此您可能仍然有多个线程添加相同的键:
两个线程都可以通过null检查,一个线程添加 key 并返回其值,然后第二个线程将使用新的 key 覆盖该值并返回它。

09-11 03:52