我从一个开源项目中读到了一些有趣的代码,我真的不明白。
下面的concurrentMapExample是一个java.util.concurrent.ConcurrentMap。 下面的代码可以防止多个线程同时返回isLocked = true吗?
public boolean tryLock()
{
isLocked = concurrentMapExample.putIfAbsent(key, "") == null;
return isLocked;
}
答案 0 :(得分:0)
以下代码可以防止多个线程同时返回isLocked = true吗?
是。此代码是线程安全的,只有一个线程将返回null。其他使用相同putIfAbsent(...)
(!!)的后调用key
的帖子将获得""
值,而isLocked
将为false。
为了迂腐,我建议你将平等检查包括在一个parens中,或者做一些类似下面的事情以提高可读性:
if (concurrentMapExample.putIfAbsent(key, "") == null)
return true;
else
return false;
这似乎是一个学术问题,但对于子孙后代,显然有更好的想要做到这一点。例如,使用AtomicBoolean
的相同逻辑是:
private final AtomicBoolean isLocked = new AtomicBoolean(false);
...
return isLocked.compareAndSet(false, true);