原子地执行多个操作

ada*_*shr 2 java concurrency multithreading

我正试图找到一种以ConcurrentHashMap原子方式对a执行多个操作的方法.

我的逻辑是这样的:

if (!map.contains(key)) {
    map.put(key, value);

    doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

我知道有putIfAbsent方法.但如果我使用它,我仍然无法doSomethingElse原子地调用它.

除了采用同步/客户端锁定之外,还有什么方法可以做这些事情吗?

如果它有帮助,doSomethingElse在我的情况下将非常复杂,涉及创建和启动一个线程,寻找我们刚刚添加到地图的键.

NPE*_*NPE 5

如果它有帮助,在我的情况下doSomethingElse将非常复杂,涉及创建和启动一个线程,查找我们刚刚添加到地图的键.

如果是这种情况,通常需要在外部进行同步.

在某些情况下(取决于doSomethingElse()期望地图的状态,以及其他线程可能对地图执行的操作),以下内容也可能有效:

if (map.putIfAbsent(key, value) == null) {
    doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

这将确保只有一个线程进入doSomethingElse()任何给定的密钥.

  • @adarshr - 它可能会击败你的**目的......但那是因为你期望CHM做一些它显然不会/不能做的事情. (2认同)