ブロッキングキュー BlockingQueue 実戦とその原理分析

1. BlockingQueue の紹介

1. キュー (キュー) の最上位インターフェイス

add(E) は要素を追加し、成功した場合は true を返し、それ以外の場合は例外を返します

offer(E) 要素を追加し、成功した場合は true を返し、それ以外の場合は false を返します

remove() は、キューの先頭要素を返して削除し、キューが空の場合は例外を返します

poll() はキューの最初の要素を返して削除し、キューが空の場合は null を返します

peek() キューの最初の要素を取得し、キューが空の場合は null を返します

BlockingQueue は Queue から継承し、ブロッキング機能を提供します。キューに出入りするための一般的なメソッドがあります。

エンキュー: put(E) offer(E) offer(E,long,TimeUnit)

出队:poll(),poll(long,TimeUnit),take()

1.1 実際の BlockingQueue の一般的な方法

このデモンストレーションでは、一般的に使用される 4 つのメソッドがあります。add remove offer ポーリングが使用されます。これは、キューの先入れ先出しの特性に準拠しています。

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueTest {

    public static void main(String[] args) {

        //测试add remove offer poll
        Queue addblockingQueue = new ArrayBlockingQueue(2);
        addblockingQueue.add(1);
        addblockingQueue.add(2);
//        addblockingQueue.add(3);//放入第三个Exception in thread "main" java.lang.IllegalStateException: Queue full

//        addblockingQueue.remove();
//        addblockingQueue.remove();
//        addblockingQueue.remove();//移出第三个Exception in thread "main" java.util.NoSuchElementException

        Queue offerblockingQueue = new ArrayBlockingQueue(2);
        System.out.println(offerblockingQueue.offer(1));//返回true
        System.out.println(offerblockingQueue.offer(2));//返回true
        System.out.println(offerblockingQueue.offer(3));//返回false

        System.out.println(offerblockingQueue.poll());//返回1
        System.out.println(offerblockingQueue.poll());//返回1 符合队列特性先进先出
        System.out.println(offerblockingQueue.poll());//返回null
    }
}

1.2 一般的に使用されるキュー

キュー アプリケーションのシナリオ: キューはスレッド セーフであり、スレッド プール、プロデューサー/コンシューマー モードなどのミドルウェア、および nacos レジストリでよく使用されます。 

1.2.1  ArrayBlockingQueue の概要 (TODO)

 ArrayBlockingQueue は制限付きのブロッキング キューです. 最下層は配列の実装に基づいています. スレッドの安全性を確保するために reenTrantLock を使用します. 一般的にはこれを使用することをお勧めします. ただし, 並行性の高いシナリオでは reenTrantLock を使用してロックするためです.とロック解除, 挿入と抽出の速度. パフォーマンスのボトルネックと呼ばれます. LinkedBlockingQueue は一般に高同時実行シナリオで使用されます. 実際の戦闘コードについては 1.1 を参照してください.

ソースコード分析の焦点:

1. 施工方法

2. 使用される要素: 配列、reenTrantLock、2 つの条件付きキュー (満杯でも空でもない)

3.put メソッドと take メソッド

 1.2.2 linkedBlockingQueue の紹介 (TODO)

linkedBlockingQueue は、連結リストによって実装された制限付きブロッキング キューですが、そのデフォルトの最大値は Integer.MAX_VALUE であり、非常に大きな数であるため、制限のないブロッキング キューと呼ばれることがよくあります。メモリが不足すると OOM の問題が発生するため、この問題を解決するために、初期化時にキューのサイズを指定するのが一般的です。linkedBlockingQueue also uses ReentrantLock to ensure thread safe. The difference between arrayBlockingQueue is that it has two locks, one for entering the queue and one for exit the queue. また、キューへの出入りのウェイクアップを保証するための 2 つの条件付きキューもあります。 .

ソースコード分析の焦点:

1. 施工方法

2. 使用要素

3.put,take,remove方法

1.2.3 LinkedBlockingDequeの紹介

Deque は、linkedBolckingQueue と同様の特性を持つブロッキング両端キューです.linkedBolckingQueue とは異なり、deque には reentrantLock ロックが 1 つだけあり、キューの先頭と末尾にある要素を操作するための API がいくつかあります。

addFirst(E e) 
addLast(E e) 
offerFirst(E e) 
offerLast(E e)

 

 

おすすめ

転載: blog.csdn.net/qq_21575929/article/details/124774267