0

我从一个开源项目中阅读了一些有趣的代码,但我并没有真正理解它。

下面的 concurrentMapExample 是 java.util.concurrent.ConcurrentMap。下面的代码可以防止多个线程同时返回isLocked=true吗?

public boolean tryLock()
{
    isLocked = concurrentMapExample.putIfAbsent(key, "") == null;
    return isLocked;
}
4

1 回答 1

0

下面的代码可以防止多个线程同时返回isLocked=true吗?

是的。此代码是线程安全的,只有一个线程会返回 null。putIfAbsent(...)之后使用相同key(!!)调用的其他线程将获得该""isLocked并将为 false。

为了迂腐,我建议您将相等性检查包装在括号中,或者可能执行以下操作以提高可读性:

if (concurrentMapExample.putIfAbsent(key, "") == null)
   return true;
else
   return false;

这似乎是一个学术问题,但对于后代来说,显然有更好的意愿这样做。例如,使用 an 的相同逻辑AtomicBoolean将是:

private final AtomicBoolean isLocked = new AtomicBoolean(false);
...
return isLocked.compareAndSet(false, true);
于 2013-09-26T20:48:32.307 回答