java - HashMap中在项目中不用锁,使用什么方法可以把他改造成线程安全的?
PHPz
PHPz 2017-04-18 09:48:14
0
6
524

在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?

==========================================================================

我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?

各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。

PHPz
PHPz

学习是最好的投资!

全部回覆(6)
Ty80

樓主說的方法是CopyOnWrite吧,主要思想就是操作的时候创建一个副本,但是可以参照JDKCopyOnWriteArrayList,其实它set操作的时候也是有加锁的,在遍历的时候用的是副本,所以不用加锁操作.因为如果不加锁的,最后的数据merge回去是一件头疼的事情(意味着,你在merge的時候一定是要加鎖的)

刘奇

共享資料不用鎖不能做到執行緒安全。你的方法複製那步線程不安全。
要線程安全要么不共享,要么用鎖

迷茫

每次都操作的是一個副本, 那麼每次處理結束之後如何保證所有線程可見? 而且如果基於map'進行添加, 那麼就可能會帶來數據庫事務的問題, 比如不可重讀, A線程添加後更新了map , B線程使用一個新的map'進行了覆蓋; 如果不用保證線程可見性, 使用ThreadLocal進行變量局部化.

黄舟

Collections.synchronizedMap(Map)
就可以封裝為執行緒安全的

伊谢尔伦

不使用鎖無法做到執行緒安全。只是在於你的鎖使用的有多高級。
HashTable 因為是物件鎖定所有的操作都會同步,這是最基本的應用。
ConcurrentHashMap 的鎖定比較高級,因為在內部實現類似分區的功能,將不同的鍵存儲在不同的區域,這實現就可同時多個線程操作ConcurrentHashMap,但是對於同一個區域的操作還是只能單線程操作(鎖)。

大家讲道理

Collections.synchronizedMap......?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!