自动整数线程说明

Automic Integer Thread Clarification

我有以下代码,

private final Map<String, AtomicInteger> wordCounter = new ConcurrentHashMap<>();

AtomicInteger count = wordCounter.get(word);
if (count == null) {
    if ((count = wordCounter.putIfAbsent(word, new AtomicInteger(1))) == null) {
        continue;
    }
}
count.incrementAndGet();

我在 IF 条件下检查 count == null。据我所知,AutomicInteger 中的操作是线程安全的。是否需要使用其中一种锁定机制来锁定 count 实例?

以上代码在没有任何额外锁定的情况下工作,但可以简化为以下惯用形式

// If word doesn't exist, create a new atomic integer, otherwise return the existing
wordCounter.computeIfAbsent(word, k -> new AtomicInteger(0))
    .incrementAndGet();  // increment it

您的代码看起来有点像 double checked locking,因为在 null 检查之后使用 putIfAbsent() 以避免覆盖另一个线程可能放置在那里的值。但是,该路径会创建一个额外的 AtomicInteger,这在 DCL 中不会发生。额外的对象可能无关紧要,但它确实使解决方案少了一点"pure"。