JAvaコレクション同時処理


Javaクラスライブラリに表示される最初の関連付けの集合クラスは、JDK 1.0の一部であるHashtableです.Hashtableは、使いやすく、スレッドが安全で、関連するmap機能を提供し、確かに便利です.しかしながら、スレッドセキュリティには、Hashtableのすべての方法が同期されているという代価がある.したがって、競合のない同期は、パフォーマンスのコストを大幅に削減します.(現在参加しているプロジェクトから見ると、グローバル変数やローカル変数にかかわらず、リクエストされるたびにスレッドがprototypeオブジェクトを作成し、新しいオブジェクトをインスタンス化するため、このシーンは少ない.コレクションクラスオブジェクトは複数のスレッドで同時に使用されない)HashMapHashtableの後継者であり、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