3

ConcurrentHashMap (put はスレッド セーフ) を使用していて、ConcurrentHashMap put を使用するパブリック関数 myPut を提供する場合、関数を同期する必要がありますか?

意味 : これを同期する必要がありますか?

ConcurrentHashMap map;  
public void myPut(int something) {  
   this.map.put(something);  
}
4

5 に答える 5

4

map参照が宣言されていないため、final変更される可能性があります。したがって、ここには潜在的なスレッドのバグがあります。

可変参照であると想定される場合mapは、さらに作業を行う必要があります。それ以外の場合はを使用しますfinal。確かに、finalそうしないほうが「簡単」であっても、できる限り使用してください。「final新しい[古い]privateです。」map privateあなたはおそらく、ジェネリックも作りたいと思うでしょう。

于 2008-11-19T15:16:51.420 に答える
2

ConcurrentHashMap などの同時実行ユーティリティは、同期する必要がないように設計されています。内部でスレッド セーフなアクセスを処理します。

Tom が言っていることは、マップ参照が変更される可能性について考える必要があるということです。参照が実際に変更されない場合、実際にはここで問題を解決できます: ConcurrentHashMap の内部同期 (実際には java.util.concurrentlibrary 一般) により、マップに配置されたオブジェクトが安全に公開されることが保証されます。他のスレッドへ。しかし、それでも、参照が変更できるかどうかを判断し、コードでこれを明示的に記述することをお勧めします (変更できない場合は「final」、変更できない場合は「volatile」または AtomicReference など)。できる)。

于 2008-12-24T17:01:39.820 に答える
1

ConcurrentHashMap を使用する場合、'put' を同期するべきではありませんが、'puts' が一度に呼び出されるという意味ではありません。これは、マップの同時実行レベルによって異なります...

ですから、自分が何を望んでいるのかを知らなければなりません。

ところで、 ConcurrentHashTable Javadoc を見てください。すべてがよく説明されています...

-パトリック

于 2008-11-19T11:03:33.960 に答える
0

場合によります。

複数のスレッドから使​​用されるオブジェクトのクラスを作成すると、ゲーム全体が変わります。スレッドの安全性を保証したい場合は、達成しようとしている結果を理解する必要があります。

この場合、これがクラス内の唯一のメソッドである場合、このメソッドへのアクセスを同期しても意味がありません。しかし、それが唯一の方法というわけではありません - それはクラスをかなり無意味にするからです。

このメソッドを同期する必要があるのは、他の理由でクラス スレッドを安全にするために必要な場合のみですConcurrentHashMap

于 2008-11-19T12:59:32.663 に答える
0

いいえ
。一度に複数回 myPut を呼び出すことができます。
HashTable のアクセスは一度に 1 つである必要があるため、put は一度に 1 つずつ呼び出されます。(共有メモリへの同時書き込みも参照)

于 2008-11-19T10:55:03.447 に答える