2013-09-26 101 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'版本更直觀。 –

相關問題