私はプライベート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. 外部からのローカルシステムへのアクセス
- 2. jQuery 'closure'から外部メソッドへのアクセス
- 3. 同期対非同期データベースへのアクセス
- 4. 外部アクカアクターへのアクセス
- 5. 同期関数への外部呼び出しの保持/ロック
- 6. IISの外部からの非同期HTTPハンドラの起動
- 7. C++:クラスの外部からのパブリックメンバー関数へのアクセス
- 8. サーバーからクライアントへの部分的なデータベースモデルの同期
- 9. レール内からのデータベース外部へのアクセス
- 10. 共有メモリへのアクセスの同期
- 11. アクティビティ、非同期、サービスからSQLiteへのアクセス
- 12. 外部設定のアプリケーションプロパティ($ {appName})へのアクセス
- 13. iTextの外部URLリソースへのアクセス
- 14. 外部サーバー上のファイルへのアクセス
- 15. 外部クラスのフィールドへのアクセス
- 16. XAMPPへの外部アクセスの設定
- 17. Spring mvc:外部フォルダへのリソースのアクセス
- 18. 外部プログラムのファイル出力へのアクセス
- 19. Wordpressプラグインの外部データベースへのアクセス
- 20. UIスレッドの外部コントロールへのアクセス
- 21. 変数へのアクセスを同期する
- 22. Extjsグリッドカラムレンダリング機能、外部ストアへのアクセス
- 23. Jqueryツールバーヘルプ:外部PHPスクリプトへのアクセス
- 24. デスクトップアプリケーションからのNeo4jへの同時アクセス
- 25. クラス外からのMooToolsクラスメソッドへのアクセス
- 26. SharePointからSQL Serverへのリアルタイム同期
- 27. Pythonのスクリプトから外部プログラムデータファイルにアクセス
- 28. なぜ外部同期は内部同期より高速ですか?
- 29. Django:外部キーからユーザへのエラー
- 30. はフラッシュ非同期または同期の外部インターフェイスですか?
私はConcurrentHashMapについて考えましたが、実際には時にはマップに同時にアクセスするいくつかのスレッドで作業する必要がありますか? – Wyvern666
@ Wyvern666私はConcurrentHashMapをCollections.synchronizedMapよりも多くのスレッドがマップにアクセスできるすべての場合に使用します。私は理由がないとは思わない。 –
同期はマップ参照には含まれませんが、参照はプライベートです。どのように反復するとき、別のクラスからそれを同期させるのですか? – Wyvern666