JAVA並行システム-3-コンカレント・コンテナー

コピー・オン・ライト(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の

TODO:トーク同時(7) - Javaのブロックキュー

ブロッキングキュー(BlockingQueueのは)二つの追加操作のキューのサポートです。これら二つの追加の操作は以下のとおりです。キューは、空のキューが空になるのを待ちますスレッドの要素を取得しています。キューがいっぱいになると、スレッドは、使用可能なキューの記憶素子をお待ちしております。(すなわち生産と消費

一般的に使用されるキューのブロッキングシーンの生産者と消費者を、プロデューサがキュースレッド要素に追加され、消費者は、キューのスレッドから要素を取ることです。キュー・ストレージ・コンテナ要素をブロックすることは生産者であり、消費者は唯一のコンテナから要素を取ります。

図7は、ブロッキングキューを提供します。彼らは

  • ArrayBlockingQueue:キューをブロック境界アレイから成る構造。
  • LinkedBlockingQueue:ブロッキングキュー囲まれた構造体のリンクリスト。
  • PriorityBlockingQueue:無制限のブロッキングキューのサポートの優先順位付け。
  • DelayQueue:使用プライオリティキューアンバウンド形式のブロッキングキューの実装。
    • 達成するための優先度つきキューを使用してキュー。キューの要素が遅延インタフェースを実装する必要があります
    • それはのために使用することができます。
      • デザイン・キャッシング・システム:あなたは、DelayQueueは、要素から取得した後、糸ループクエリDelayQueueを使用し、有効性のキャッシュ要素保存DelayQueueを使用する有効なキャッシュを表すことができます。
      • タスクのスケジューリングタイミング。使用タスクの実行時間DelayQueueを救うと、このようなTimerQueueから開始されたタスクは、DelayQueueを実施し使用することですDelayQueueから取得するために一度実行されます。
  • SynchronousQueue:ブロックキュー要素が格納されていません。
  • LinkedTransferQueue:無制限ブロッキングキューからなるリスト構造。
  • LinkedBlockingDeque:双方向のブロッキングキューからなるリンクリスト構造。

ブロッキングキューの原則

達成するための通知モードを使用します。フルキューへの生産者が、ライブプロデューサー要素が追加されているブロックされます場合には、いわゆる通知モード、消費者は、キューの要素を費やしたときに、キューは生産者が現在利用可能通知します。これを達成するために使用するのawait、信号

TODO:トーク同時(7) - Javaのブロックキュー

参照

  1. 同時-Javaのコピー・オン・ライトトークコンテナ

おすすめ

転載: www.cnblogs.com/cheaptalk/p/12549668.html