在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?
==========================================================================
我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?
各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。
投稿者が言及した方法は
。CopyOnWrite
であり、操作中にコピーを作成することが主なアイデアですが、JDK
のCopyOnWriteArrayList
も実際にはset
中にロックされます。コピーを使用する場合、操作をロックする必要はありません。ロックされていないと、最終データをマージし直すのが面倒になるためです (つまり、merge
のときにロックする必要があります)共有データはロックなしではスレッドセーフにはなりません。メソッドのコピー ステップはスレッドセーフではありません。
スレッドセーフにするために、ロックを共有したり使用したりしないでください
コピーを操作するたびに、各処理後にすべてのスレッドが確実に表示されるようにするにはどうすればよいですか? また、マップに基づいてコピーを追加すると、再読み取りが行われない、後で追加するスレッドなど、データベース トランザクションの問題が発生する可能性があります。マップを更新すると、スレッド B が新しいマップで上書きされます。'; スレッドの可視性を保証する必要がない場合は、変数のローカライズに ThreadLocal を使用します。
Collections.synchronizedMap(Map)
はスレッドセーフとしてカプセル化できます
ロックを使用せずにスレッドの安全性を実現することはできません。それはロックがどの程度進んでいるかによって決まります。
HashTable オブジェクトロックのすべての操作が同期されるため、これは最も基本的なアプリケーションです。
ConcurrentHashMap のロックは、内部的にパーティションのような関数を実装し、異なる領域に異なるキーを格納するため、比較的高度です。この実装により、複数のスレッドが ConcurrentHashMap を同時に操作できるようになりますが、同じ領域での操作は依然として可能です。シングルスレッド操作 (ロック)。
Collections.synchronizedMap....?