2013-09-26 66 views
0

我从一个开源项目中读了一些有趣的代码,但我并没有真正理解它。使用ConcurrentHashMap来模拟锁,是否确定安全?

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

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

对我的答案有任何反馈?如果它帮助你,请记得接受它。 – Gray

回答

0

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

是的。这段代码是线程安全的,只有一个线程会返回null。其他线程调用putIfAbsent(...)事后key(!!)将得到""值和isLocked将是错误的。

要学究,我建议你换平等检查在括号或可能这样做以下,以提高可读性:

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

这似乎是一个学术问题,但留给后人,有明显更好的想要做到这一点。例如,使用AtomicBoolean的相同逻辑应该是:

private final AtomicBoolean isLocked = new AtomicBoolean(false); 
... 
return isLocked.compareAndSet(false, true); 
+1

你为什么要做'return true/return false'而不是仅仅写'returns concurrentMapExample.putIfAbsent(key,“”)== null'?我无法想象具有不同的语义。 –

+0

因为这对我来说更好@LouisWasserman。任何我的大脑必须绊倒的东西(甚至3秒钟)都不值得。它编译到相同的代码,但它更容易理解。这就是为什么我不写'while((line = reader.readLine())!= null)'类型的代码的原因。 – Gray

+1

我同意'while'循环很难阅读,但我想我们必须同意不同意'putIfAbsent'这个案例,我发现它比'if'版本更直观。 –

相关问题