Synch ronousQueデータ構造の基本的な紹介

7168 ワード

Synch ronousQue
特徴
  • は列をブロックするブロッキング・Queの一つの実現であり、方法はBlokingQueの基本的性質を持っている。
  • とArayBlocking Queの違いは、ArayBlocking Queの内部には、要素を格納するための配列があり、キャッシュエリアに相当する。Synch ronousQueに対しては、データを保存するための内部構造がない。
  • は、特定のスレッドAに対して、データを挿入するには、他のスレッドBがデータを取りたいと考えている必要があり、そうでなければ、スレッドAブロック(下の層はUsafe.parkを呼び出してブロックされている)。このように実現される目的は、生産データの速度と消費データのペースが一致することです。
  • 主なデータ構造
  • Transferer
  • Shared internal API for dual stacks and queues
    上のインターフェイスはデータ転送のキーアプリを保存しています。上の英語は中国語に変換して、ダブルスタックとダブルキューの共有内部アプリとして表示すべきです。「ダブル」は主に検査を行います。データを取る時、スレッドがないとデータを保存します。データを取るノードを作成します。データを保存する場合、データを取るスレッドがないと、データを格納するノードを作成します。これらの二つのノードは同じ構造で表される。このチェーンには、同じ時刻に一つのタイプのノードしか存在しない。
    Transfererインターフェースの二つの実装クラス:
  • TransferStockは、非公正なアクセスデータを実現するために使用されます。
  • TransferQueは、公平なアクセスデータを実現するために使用されます。
  • モモ
    import java.util.Collection;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.SynchronousQueue;
    
    public class Test {
    
        public static void main(String[] args) throws Exception {
            SynchronousQueue<Integer> queue = new SynchronousQueue<>(true);
    
    
            new Thread(() -> {
                try {
                    queue.put(1);
                }catch (InterruptedException e) {}
            }, "producer1").start();
    
            new Thread(() -> {
                try {
                    queue.put(2);
                }catch (InterruptedException e) {}
            }, "producer2").start();
    
            new Thread(() -> {
                try {
                    System.out.println(queue.take());
                }catch (InterruptedException e) {}
            }, "consumer1").start();
        }
    }
    
    結果分析:
    出力結果は1または2かもしれません。二つのスレッドはそれぞれ一つのデータを挿入し、一つのスレッドはデータを取ります。実行後、スレッドがブロックされます。二つの数を入れてみたが、一つの数だけが消費された。もう一回消費しないと閉塞スレッドが解除されます。