2014-02-07 117 views
2

的ConcurrentHashMap的的javadoc說:的ConcurrentHashMap和線程安全

的哈希表支持更新檢索的完全併發和可調 預期的併發性。該類遵循與Hashtable相同的功能 規範,並且包括與Hashtable的每種方法對應的方法 的版本。但是,即使所有 操作都是線程安全的,但檢索操作不會導致鎖定,並且也不支持以阻止所有訪問的方式鎖定整個表的 。 該課程完全與 Hashtable在依賴其線程安全性的程序中完全互操作,但不依賴其 同步詳細信息。

以上段落中以下語句的含義是什麼?

這個類是Hashtable的完全互操作的,關於它的線程安全依靠 程序,但不是它的同步信息

回答

0

看到這個的Javadoc哈希表:

由於在Java 2平臺v1.2中,該類被改造爲 實現了Map接口,使其成爲Java Framework的成員之一 。與新的集合實現不同, 哈希表是同步的。如果需要線程安全的實現不是 ,則建議使用HashMap來代替Hashtable。如果需要 線程安全高度並行實現,則建議使用 來代替Hashtable使用ConcurrentHashMap。

我認爲他們說Hashtable有同步方法,但新的ConcurrentHashMap不使用同步來確保線程安全。至於「可互操作性」,我認爲這意味着界面基本相同 - 所以你可以使用任何一個。

1

Hashtable方法是​​,你可以寫是肯定的哈希表的狀態也不會在中途改變的代碼塊:

syncronized (hashtable) { 
    if (!hashtable.contains(key)) 
     hashtable.put(key, value); 
} 

ConcurrentHashMap的方法是不​​(雖然還是thread-如javadoc中指定的那樣),您無法與其狀態同步執行復合操作。

注意:上面的示例複合操作在ConcurrentHashMap api:putIfAbsent(K, V)中有一個完美的等價操作,但其他一些有用的操作沒有。

+0

是'你不能與其狀態同步執行復合操作'是否意味着我們不能用'synchronized(concurrenthashmap_obj)'來使用上面的代碼? –

+0

@aLearner是的。在語法上你可以,因爲,但它對線程安全沒有意義 – leventov