私はプライベートHashMap
を持っていて、私はそれにCollections.synchronizedMap()
を使用しています。 APIは、マップが反復されるときに実際には「スレッドセーフ」ではないと言います。私は通常マップを反復するためにMap.entrySet()
を使用していますので、マップにはAPIのような手動同期ブロックが必要です。しかし、私はマップの参照を同期させることはできません。プライベートなので....私は実際のマップ参照(おそらくこれは良いOOPの設計ではない)にゲッターを提供する必要がありますか、または深いコピーを返す地図の? (これは遅いかもしれない)。私はこのような状況になる最良の方法は何か分かりません。誰かが何らかのアイデアを出したり、このような状況に直面する最も典型的な方法を教えてもらえますか?外部からのHashMapへのアクセスの同期
2
A
答えて
3
実際にHashMapに同時にアクセスする必要がある場合は、ConcurrentHashMapを使用することを強くお勧めします。これは、Java 5以降のutil.concurrentパッケージの一部です。これは、同期化されたラッパーよりもマルチスレッド環境で優れたパフォーマンスを発揮します。
マップの作成方法(サードパーティのライブラリにある可能性があります)を制御できない場合は、そのマップを反復処理するときにアクセスを同期させる必要があります。詳細については、Collections.synchronizedMapのJavaDocsを参照してください。 APIドキュメントに含まれるサンプルコードを次に示します。
Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized (m) { // Synchronizing on m, not s!
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
関連する問題
- 1. PouchDBの外部アクセス、同期時のエラー
- 2. 外部からのローカルシステムへのアクセス
- 3. 外部からフォームクラスメンバ関数へのアクセス
- 4. jQuery 'closure'から外部メソッドへのアクセス
- 5. 同期対非同期データベースへのアクセス
- 6. ローカルメモリへのアクセス/同期
- 7. キューへの同期アクセス
- 8. 外部アクカアクターへのアクセス
- 9. kubernetes - 外部ファイアウォールへのアクセス
- 10. 配列外部へのアクセス
- 11. ASP.NETコードの同期から非同期/待機への部分的な移行
- 12. C++:クラスの外部からのパブリックメンバー関数へのアクセス
- 13. 同期関数への外部呼び出しの保持/ロック
- 14. IISの外部からの非同期HTTPハンドラの起動
- 15. 外部スクリプトからのブートストラップモーダルでのフォームの非同期ロード
- 16. C#外部スコープからのデータテーブルへのアクセス
- 17. レール内からのデータベース外部へのアクセス
- 18. ユーザ定義のファイルパス(Java)から外部リソースへのアクセス
- 19. timeitからの外部変数へのアクセス
- 20. C#構造体 - 外部ライブラリからのクラスへのアクセス
- 21. AWS LambdaからVDS外部のRDSへのアクセス
- 22. サーバーからクライアントへの部分的なデータベースモデルの同期
- 23. 共有メモリへのアクセスの同期
- 24. Javaの場合、同期オブジェクトへのアクセス
- 25. アクティビティ、非同期、サービスからSQLiteへのアクセス
- 26. 外部サーバー上のファイルへのアクセス
- 27. 外部クラスのフィールドへのアクセス
- 28. XAMPPへの外部アクセスの設定
- 29. Spring mvc:外部フォルダへのリソースのアクセス
- 30. 外部プログラムのファイル出力へのアクセス
私はConcurrentHashMapについて考えましたが、実際には時にはマップに同時にアクセスするいくつかのスレッドで作業する必要がありますか? – Wyvern666
@ Wyvern666私はConcurrentHashMapをCollections.synchronizedMapよりも多くのスレッドがマップにアクセスできるすべての場合に使用します。私は理由がないとは思わない。 –
同期はマップ参照には含まれませんが、参照はプライベートです。どのように反復するとき、別のクラスからそれを同期させるのですか? – Wyvern666