ホームページ  >  に質問  >  本文

java - HashMap中在项目中不用锁,使用什么方法可以把他改造成线程安全的?

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

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

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

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

PHPzPHPz2715日前502

全員に返信(6)返信します

  • PHP中文网

    PHP中文网2017-04-18 09:50:14

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

    返事
    0
  • 怪我咯

    怪我咯2017-04-18 09:50:14

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

    返事
    0
  • 迷茫

    迷茫2017-04-18 09:50:14

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

    返事
    0
  • 黄舟

    黄舟2017-04-18 09:50:14

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

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:50:14

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:50:14

    Collections.synchronizedMap....?

    返事
    0
  • キャンセル返事