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

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

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

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

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

PHPz
PHPz

学习是最好的投资!

全員に返信(6)
Ty80

投稿者が言及した方法は CopyOnWrite であり、操作中にコピーを作成することが主なアイデアですが、JDKCopyOnWriteArrayList も実際には set 中にロックされます。コピーを使用する場合、操作をロックする必要はありません。ロックされていないと、最終データをマージし直すのが面倒になるためです (つまり、merge のときにロックする必要があります)

いいねを押す +0
刘奇

共有データはロックなしではスレッドセーフにはなりません。メソッドのコピー ステップはスレッドセーフではありません。
スレッドセーフにするために、ロックを共有したり使用したりしないでください

いいねを押す +0
迷茫

コピーを操作するたびに、各処理後にすべてのスレッドが確実に表示されるようにするにはどうすればよいですか? また、マップに基づいてコピーを追加すると、再読み取りが行われない、後で追加するスレッドなど、データベース トランザクションの問題が発生する可能性があります。マップを更新すると、スレッド B が新しいマップで上書きされます。'; スレッドの可視性を保証する必要がない場合は、変数のローカライズに ThreadLocal を使用します。

いいねを押す +0
黄舟

Collections.synchronizedMap(Map)
はスレッドセーフとしてカプセル化できます

いいねを押す +0
伊谢尔伦

ロックを使用せずにスレッドの安全性を実現することはできません。それはロックがどの程度進んでいるかによって決まります。
HashTable オブジェクトロックのすべての操作が同期されるため、これは最も基本的なアプリケーションです。
ConcurrentHashMap のロックは、内部的にパーティションのような関数を実装し、異なる領域に異なるキーを格納するため、比較的高度です。この実装により、複数のスレッドが ConcurrentHashMap を同時に操作できるようになりますが、同じ領域での操作は依然として可能です。シングルスレッド操作 (ロック)。

いいねを押す +0
大家讲道理

Collections.synchronizedMap....?

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!