2014-09-30 94 views
4

下面是兩種方法,都創建concurrentHashMap的實例,我的理解是方法2是線程安全的但不是方法1。但是我正在與同事和每個人進行對話,因爲兩者都創建實例concurrentHashMap不應該接近1也是線程安全的嗎?線程安全與地圖和併發哈希映射

方法1:

private static final Map<key, value> map = new ConcurrentHashMap<key, value>(); 

方法2:

private static final ConcurrentHashMap<key, value> concurrentHashMap = new ConcurrentHashMap<key, value>(); 

希望得到關於此的任何澄清。

+5

這與說「這兒是我兒,約翰」和「這是我的孩子,約翰」之間的區別基本相同。不管你提及約翰如何,iy總是約翰。這是基本的多態,你應該明白,甚至在考慮多線程和線程安全之前,這些更復雜的事情。 – 2014-09-30 19:29:36

+0

您也可以使用'Collections.synchronizedMap(map)'。 – Hannes 2014-09-30 20:47:13

回答

6

您在這兩種情況下都創建了ConcurrentHashMap,所以線程安全性完全相同。

ConcurrentHashMap實現Map接口,這是您在示例1中調用的接口。但是,這對實例化的底層對象沒有影響。

2

顯然,對象在兩種情況下都具有相同的運行時類型。

但是,當作爲Map查看時,putIfAbsent和其他ConcurrentMap方法對客戶端隱藏。否認他們並強迫他們使用傳統的putget是我期望您的同事所表達的擔憂。

0

以下僅爲Map對象創建一個指針並將其實例化爲null。

private static final Map<key, value> map; 

下面一行是在對象爲創建真正的,在這兩種情況下是一個實例的ConcurrentHashMap,變量映射指向它的地址。 這是重要的,實際的情況。

map = new ConcurrentHashMap<key, value>(); 

所以不能有任何兩者之間的區別!

1

這兩種解決方案都是線程安全的。你應該更熟悉java接口:) 因爲兩者都是對同一個映射實現的引用。第一種解決方案通過界面隱藏了這一事實,其次不是。 第一種方法甚至是claner-它涉及到集合時,推薦使用api接口而不是class obj。這將有助於將更改應用於您的代碼。 我希望我的解釋能有所幫助。