コピー・オン・ライト(COW)
コピー・オン・ライトの短いCOW(ない乳牛)は、プログラム設計のための最適化戦略です。コピーオンライト技術が飛躍的にして、Linuxファイルシステム、Linuxのコピーオンライト技術のアプリケーションを持っているフォークのコストを削減し、ファイルシステムは上のある程度のコピーオンライト技術によって保証されたデータの整合性。(TODO:この問題について詳しく説明するための専用の記事を書きます)
同時Javaパッケージも彼の影を持っているでは、このセクションでは、同時パッケージのコピーオンライト技術を説明しています。
基本的な考え方コピーオンライトは、誰かが内容を変更したい場合、我々はすべて同じコンテンツを共有し始めてから、コンテンツのコピーが実際に新しいコンテンツの形式や、その後の変化を、出します、です一種の遅延怠惰な戦略。
COWパッケージに応じて同時アセンブリが含まれています。CopyOnWriteArrayListととCopyOnWriteArraySetを
コピーオンライトコンテナは何ですか
コピー・オン・ライト容器であるコピーオンライト・コンテナ。開始JDK1.5のJava並行処理パッケージから同時使用コピーオンライトのコンテナを達成するために2つのメカニズムを提供し、彼らはCopyOnWriteArrayListとしてCopyOnWriteArraySetです。
-
要素を追加するプロセス:
人気の理解がロックするプロセスの必要性を追加する(私たちはコンテナに要素を追加する場合、直接現在のコンテナに追加しますが、最初に現在のコンテナをコピーし、新しいコンテナをコピーし、新しいコンテナ要素を追加していないということです)、要素の追加が完了し、その後、元のコンテナの参照は新しいコンテナを指します。
-
利点:
現在のコンテナに要素が追加されませんので、ロックする必要なしにコピーオンライト・コンテナ上で同時に読み取ることができます。したがって、コピーオンライトコンテナはまた、ある別の読み取りと書き込みの思考、読書と異なるコンテナの書き込み。
-
短所:
-
メモリフットプリントの問題
書き込み操作を実行すると、メモリは、メモリ、古いオブジェクトとオブジェクト書き下ろし2つのオブジェクトを駐留されます。これらのオブジェクトはメモリが比較的大きい占有した場合、それは長期または頻繁にGC GCで、その結果、より多くのリソースを占有します。
他の同時使用のコンテナまたはコンテナの圧縮要素のConcurrentHashMapとして、
-
データ整合性の問題
データのみが最終的な一貫性を保証することができ、我々は、リアルタイムのデータの一貫性を保証することはできません
-
-
シナリオ:
読み取りと少ない同時実行シナリオを書きます。次のような例
- ホワイトリスト、ブラックリスト
- 商品カテゴリへのアクセスおよび更新シーン
-
ライブラリコンポーネント:CopyOnWriteArrayListととCopyOnWriteArraySet
そして、それは、このようCOWアプリケーションを実現する、CopyOnWriteArrayListとCopyOnWriteArraySet AbstractSet ListインタフェースとCopyOnWriteArraySet CopyOnWriteArrayListとインスタンスフィールドを備えるインタフェースを実現しました。そこで、彼らは2つの類似した行動しています
原則(読み取り/書き込み)
private boolean addIfAbsent(E e, Object[] snapshot) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] current = getArray();
int len = current.length;
......
Object[] newElements = Arrays.copyOf(current, len + 1);// 复制出新数组
newElements[len] = e; // 把新元素添加到新数组里
setArray(newElements);// 把原数组引用指向新数组
return true;
} finally {
lock.unlock();
}
}
...
final void setArray(Object[] a) {
array = a;//直接修改引用
}
上記のコードがされ書かれた要素は、追加の時間で見つけることができるに必要であり、ロックさもなければ時間がマルチスレッドコピーし、それのN個のコピーを書き込みます。
リード素子我々はしていないに必要なロックデータがコンテナに追加されたときに読んで、複数のスレッドがある場合は、読み込みまたは読み込みます古いデータを書き込むための時間が古いコンテナをロックしていないので、
ConcurrentMap
すべてのConcurrentHashMap
TODO:ConcurrentSkipListMapの==> ConcurrentSkipListSetの
TODO:話同時(d)の詳細な分析ののConcurrentHashMap
マルチスレッド環境、ハッシュマップの使用は、あなたが同時実行でHashMapを使用することはできませんので、アクションが、100%にCPU使用率の近くで、その結果、無限ループが発生します置くこと
非効率的なハッシュテーブルコンテナ、コンテナハッシュテーブルはセキュリティ・スレッドを確保するために、同期使用する場合、他のスレッド同期メソッドハッシュテーブルへのアクセスはブロックまたはポーリング状態に入ることができます
ConcurrentHashMapのロックセグメンテーション技術
ConcurrentHashMapの初期化
ポジショニングセグメント
ConcurrentHashMapのget操作
操作のConcurrentHashMapのサイズ
ConcurrentLinkedQueue
すべてConcurrentLinkedQueue
すべてConcurrentLinkedDeque
二つの方法で実装スレッドセーフなキューを実装:1のアルゴリズムをブロック使用し、他は非ブロックアルゴリズムを使用することです。
ループの非ブロッキング実装を使用することができるが、ブロッキングアルゴリズムを使用して、達成したいロック待ち行列(エンキューおよびデキュー同じロック付き)、または2つのロック(異なるロックとエンキューおよびデキュー)と使用することができ達成するためのCASの方法、ConcurrentLinkedQueueはスレッドセーフなキューを達成するために、非ブロッキングの方法を使用しています
BlockingQueueの
TODO:BlockingQueueの
ブロッキングキュー(BlockingQueueのは)二つの追加操作のキューのサポートです。これら二つの追加の操作は以下のとおりです。キューは、空のキューが空になるのを待ちますスレッドの要素を取得しています。キューがいっぱいになると、スレッドは、使用可能なキューの記憶素子をお待ちしております。(すなわち生産と消費)
一般的に使用されるキューのブロッキングシーンの生産者と消費者を、プロデューサがキュースレッド要素に追加され、消費者は、キューのスレッドから要素を取ることです。キュー・ストレージ・コンテナ要素をブロックすることは生産者であり、消費者は唯一のコンテナから要素を取ります。
図7は、ブロッキングキューを提供します。彼らは
- ArrayBlockingQueue:キューをブロック境界アレイから成る構造。
- LinkedBlockingQueue:ブロッキングキュー囲まれた構造体のリンクリスト。
- PriorityBlockingQueue:無制限のブロッキングキューのサポートの優先順位付け。
- DelayQueue:使用プライオリティキューアンバウンド形式のブロッキングキューの実装。
- 達成するための優先度つきキューを使用してキュー。キューの要素が遅延インタフェースを実装する必要があります
- それはのために使用することができます。
- デザイン・キャッシング・システム:あなたは、DelayQueueは、要素から取得した後、糸ループクエリDelayQueueを使用し、有効性のキャッシュ要素保存DelayQueueを使用する有効なキャッシュを表すことができます。
- タスクのスケジューリングタイミング。使用タスクの実行時間DelayQueueを救うと、このようなTimerQueueから開始されたタスクは、DelayQueueを実施し使用することですDelayQueueから取得するために一度実行されます。
- SynchronousQueue:ブロックキュー要素が格納されていません。
- LinkedTransferQueue:無制限ブロッキングキューからなるリスト構造。
- LinkedBlockingDeque:双方向のブロッキングキューからなるリンクリスト構造。
ブロッキングキューの原則
達成するための通知モードを使用します。フルキューへの生産者が、ライブプロデューサー要素が追加されているブロックされます場合には、いわゆる通知モード、消費者は、キューの要素を費やしたときに、キューは生産者が現在利用可能通知します。これを達成するために使用するのawait、信号