JAvaコレクション同時処理
Javaクラスライブラリに表示される最初の関連付けの集合クラスは、JDK 1.0の一部である
狭いスレッドのセキュリティ
同期された集合パッケージ
キャッシュでのMapの使用
ConcurrentHashMap
まとめ:
同期クラス
Reference:
http://www.ibm.com/developerworks/cn/java/j-jtp07233/
http://www.ibm.com/developerworks/cn/java/j-concurrent/#JAVAZ167
Hashtable
です.Hashtable
は、使いやすく、スレッドが安全で、関連するmap機能を提供し、確かに便利です.しかしながら、スレッドセキュリティには、Hashtable
のすべての方法が同期されているという代価がある.したがって、競合のない同期は、パフォーマンスのコストを大幅に削減します.(現在参加しているプロジェクトから見ると、グローバル変数やローカル変数にかかわらず、リクエストされるたびにスレッドがprototypeオブジェクトを作成し、新しいオブジェクトをインスタンス化するため、このシーンは少ない.コレクションクラスオブジェクトは複数のスレッドで同時に使用されない)HashMap
はHashtable
の後継者であり、JDK 1として機能する.2の集合フレームワークの一部は、非同期ベースクラスHashMapと同期パッケージCollections.synchronizedMap
を提供することによって、スレッドセキュリティの問題を解決する.これにより、基本的な機能がスレッドセキュリティから分離され、Collections.synchronizedMap
はユーザーにより多くの自由な選択を与え、同期が必要なユーザーが同期を持つように選択できる場合、同期を必要としないユーザーは同期のために代価を払う必要はありません.狭いスレッドのセキュリティ
同期された集合パッケージ
synchronizedMap
およびsynchronizedList
は、条件付きスレッドセキュリティとも呼ばれることもある.すべての単一のオペレーションはスレッドセキュリティであるが、複数のオペレーションからなるオペレーションシーケンスは、オペレーションシーケンスにおける制御フローが前のオペレーションの結果に依存するため、データ競合を引き起こす可能性がある.キャッシュでのMapの使用
Map
サーバアプリケーションで最も一般的なアプリケーションの1つは、cache。
サーバアプリケーションを実装するために、ファイルの内容、生成されたページ、データベースクエリの結果、解析されたXMLファイルに関連するDOMツリー、および多くの他のタイプのデータをキャッシュする必要がある可能性があることである.Cacheの主な用途は、前回の処理で得られた結果を再利用して、サービス時間を低減し、スループットを増加させることである.Cacheワークロードの典型的な特徴は、検索が更新よりも大幅に多いことであり、したがって(理想的には)cacheは、get()
の非常に良好な性能を提供することができる.synchronizedMap
を使用してcacheを実装すると、アプリケーションに潜在的な伸縮性ボトルネックが導入されます.一度にMap
にアクセスできるスレッドは1つしかないため、これらのスレッドにはMap
から値を取り出すスレッドと、mapに新しい(key, value)
対を挿入するスレッドが含まれます.ConcurrentHashMap
util.concurrent
パケット中のConcurrentHashMap
クラス(JDK 1.5中のjava.util.concurrent
パケットにも現れる)は、Map
のスレッドセキュリティの実装であり、synchronizedMap
よりもはるかに良好な同時性を提供する.複数のリード・オペレーションはほぼ常に同時実行可能であり、同時実行のリード・ライト・オペレーションも通常同時実行可能であるが、同時実行のライト・オペレーションは依然として時々同時実行可能である(関連クラスは同様の複数のリード・スレッドの同時性を提供するが、アクティブなライト・スレッドが1つしか許可されない)。ConcurrentHashMap
は、検索オペレーションを最適化するために設計されている.実際には、成功したget()
操作が完了した後、ロックされたリソースは通常存在しません.ロックを使用せずにスレッドセキュリティを取得するには、一定のテクニックが必要であり、Javaメモリモデル(Java Memory Model)の詳細を深く理解する必要があります.ConcurrentHashMap
実装は、util.concurrent
パケットの他の部分を加えて、正確性とスレッドセキュリティが研究されている同時専門家によって直視されている.まとめ:
同期クラス
Hashtable
およびVector
、ならびに同期パッケージクラスCollections.synchronizedMap
およびCollections.synchronizedList
は、Map
およびList
に基本的な条件付きスレッドセキュリティの実装を提供する.しかしながら、いくつかの要因により、それらの集合範囲の単一ロック特性は、伸縮性にとって障害であり、ConcurrentModificationException
sの異常が発生しないように、高い同時性を有するアプリケーションには適用されないことが多い.ConcurrentHashMap
およびCopyOnWriteArrayList
の実装は、より高い同時性を提供するとともに、スレッドのセキュリティを維持し、呼び出し元の承諾にわずかな割引を加えたにすぎない.ConcurrentHashMap
およびCopyOnWriteArrayList
は、HashMap
またはArrayList
を使用するどこでも役立つわけではありませんが、特定の共通ソリューションを最適化するために設計されています.多くの同時アプリケーションは、それらを使用することでメリットを得ることができます.Reference:
http://www.ibm.com/developerworks/cn/java/j-jtp07233/
http://www.ibm.com/developerworks/cn/java/j-concurrent/#JAVAZ167