2016-10-03 25 views
1

約書亞·布洛克&合着者著名的Java Concurrentcy在實踐把forwards-的句子的含義是什麼?[ConcurrentHashMap無法鎖定爲獨佔訪問]?

這是第5章積木 -

...因爲一個ConcurrentHashMap不能鎖定爲獨家 訪問.....

我的理解是獨佔訪問指的是鎖定整個集合,每個線程在操作持續時間內持有一個鎖以使其成爲原子。

ConcurrentHashMap< String, String> map = new ConcurrentHashMap< String, String>(); 

    public void getExclusiveAccess(){ 
     synchronized (map) { 
      //.... 
     } 
    } 

即使這將是愚蠢做這樣的事情上面,但顯然獨家獲得通過相同的是可以實現的。
請建議。
作者爲什麼說ConcurrentHashMap不能鎖定爲獨佔訪問

回答

1

清楚獨佔訪問是可實現的通過相同

不如果一些其他的代碼使用一個同步塊外映射(這是完全可以接受的)。

這與所有方法都在地圖上同步的synchronizedMap不同 - 因此,如果您在此類地圖上使用synchronized(map) {... },則您實際上擁有獨佔訪問權限。

+1

但我只考慮了我明確擁有獨佔訪問權的情況。 '同步(地圖){...}是否甚至保證這種情況下的獨佔訪問。 –

+2

@ShirgillFarhanAnsari CHM實現本身不支持獨佔訪問。現在,您可以始終使用客戶端鎖定來強制執行獨佔訪問,當然......但這與'Collections.synchronizedMap()'有很大不同,後者在實現級別提供獨佔訪問權限。 – assylias

2

我已經做到了這一點,但它是可以實現的,但它只適用於這種外部鎖定,不受ConcurrentMap的支持。如果您在不使用此同步的情況下訪問任何地圖,則它不會是排他性的。如果您在任何地方使用同步,則不會再發生同步。

這可能是唯一有意義的時候,如果你需要獨家寫,但不是獨家閱讀。

+0

而這顯然是客戶端鎖定。那麼爲什麼作者提到了 - **由於ConcurrentHashMap不能被鎖定爲獨佔訪問,我們不能使用客戶端鎖定來創建新的原子操作,比如put-if-absent,**我知道里面已經有了原子操作併發地圖做同樣的事情。 –

+0

@ShirgillFarhanAnsari ConcurrentMap不支持這個,這並不妨礙你實現你自己的解決方案,但是你不會從這個實現中得到任何支持。 –

相關問題