2017-03-27 81 views
2

我想同步一段代碼,但不想簡單地鎖定實現類(this)。基於Map的內容同步

有問題的代碼塊是一個方法的一部分,它需要一個id。

我想禁止一個新的線程進入該塊,如果傳入該方法的ID包含在該類的列表中......如果它不在列表中,該實體可自由操作,並因此線程將被允許進入塊...

有沒有一種簡單的方法來做到這一點?

+0

這可能是你正在尋找的答案:http://stackoverflow.com/a/17776425/1499922 –

+1

你是什麼意思與「不允許」? 'synchronized'永遠不會被禁止,它可能只會被阻塞直到可用,所以你期望的行爲是什麼? – Holger

+1

爲什麼你首先需要'同步'?一個簡單的檢查將不會執行,比如'!if(list.contains(id))return'? – Eugene

回答

5

在JDK中沒有明確的類,但是如前面的duplicate中所述,可以使用ConcurrentHashMap來實現這種行爲。

Guava提供了Striped類,它爲您提供了大量配置的良好解決方案,如懶惰地創建鎖和弱鎖,以及配置要使用的條紋(鎖)的數量。

+1

作爲承諾,一個加號的副本。 – Eugene

+1

謝謝。儘管我沒有提出這些觀點,但我只是想包括這一點,所以人們不會認爲他們需要爲這樣的事情推出自己的解決方案。我無法將此添加爲重複的答案,因爲...它已關閉。 – Kayaman

+1

我知道,up-vote正是爲了這個。這樣我就不會愚弄自己,表現出愚蠢的解決方案。 – Eugene