使用ConcurrentHashMap来模拟锁定,是否安全?

时间:2013-09-26 20:43:14

标签: java concurrency locking concurrenthashmap

我从一个开源项目中读到了一些有趣的代码,我真的不明白。

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

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

1 个答案:

答案 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);