高併発プログラミングのConcerentLinked Que解説

3902 ワード

一、ConcerentlinkedQueは、リンクノードに基づく非境界スレッドセキュリティキューを紹介します.このキューはFIFO(先入先出)原則に従って要素を並べ替えます.列の頭は列の中で一番時間が長い要素で、列の最後は列の中で一番時間が短い要素です.要素を取得すると、キューヘッドの要素を返します.これは「wait-free」アルゴリズムを採用して実現しました.このアルゴリズムはMichael&Scrottアルゴリズムにいくつかの修正を行いました.Michael&Scrottアルゴリズムの詳細情報を参照してください.http://www.cs.rochester.edu/u/michael/PODC96.html.
二、ConcerentlinkedQue一般的な方法を紹介します.1、add(E e):指定された要素を列の尾部に挿入して、戻り値はBooleanです.2、contains(Object o):この列に指定要素が含まれているなら、trueに戻ります.3、isEmpty():このキューには何の要素も含まれていない場合、trueに戻ります.4、iterator():このキュー要素に戻り、適切な順序で反復するためのシーズマリーを返し、Iteratorに戻ります.5、offer(E):指定された要素をこのキューの末尾に挿入し、返し値はbollanです.6、peek():このキューのヘッダを取得しますが、削除しません.この列が空であれば、nullに戻ります.7、poll():このキューのヘッダを取得して削除します.このキューが空の場合、nullに戻ります.8、remove(Object o):指定された要素の単一のインスタンスをキューから削除し(存在すれば)、返し値はbollanです.9、size():このキューの要素の数を返します.10、toAray():このキューのすべての要素を適切な順序で含む配列を返す.
三、Javaコードの例
package chapter3.concurrentlinkedqueue;

import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @author czd
 */
public class ConcurrentLinkedQueueTest {
    public static void main(String[] args) {
        /**
         *       
         * ConcurrentLinkedQueue():
         *                     ConcurrentLinkedQueue
         */
        ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue();
        /**
         * 1、add(E e) :             ,    Boolean。
         */
        Boolean addBoolean = concurrentLinkedQueue.add(5);
        System.out.println("           : " + addBoolean);

        /**
         * 2、contains(Object o) :           ,    true。
         */
        Boolean containsBoolean = concurrentLinkedQueue.contains(5);
        System.out.println("    5:" + containsBoolean);

        /**
         * 3、isEmpty() :            ,    true
         */
        Boolean isEmptyBoolean = concurrentLinkedQueue.isEmpty();
        System.out.println("concurrentLinkedQueue    :" + isEmptyBoolean);

        /**
         * 4、iterator() :                      ,     Iterator	。
         */
        concurrentLinkedQueue.add(6);
        concurrentLinkedQueue.add(7);
        concurrentLinkedQueue.add(8);
        System.out.println("=====================");
        Iterator iterator = concurrentLinkedQueue.iterator();
        while (iterator.hasNext()){
            System.out.println("iterator   :" + iterator.next());
        }

        /**
         * 5、ffer(E e) :             ,    boolean。
         */
        Boolean offerBoolean = concurrentLinkedQueue.offer(9);
        System.out.println("          :" + offerBoolean);


        /**
         * 6、peek() :           ;       ,    null。
         */
        Integer peekResult = concurrentLinkedQueue.peek();
        System.out.println("        :" + peekResult);

        /**
         * 7、poll() :          ,       ,    null。
         */
        Integer pollResult = concurrentLinkedQueue.poll();
        System.out.println("        :" + pollResult);

        /**
         * 8、remove(Object o) :               (    ),    Boolean。
         */
        Boolean removeBoolean = concurrentLinkedQueue.remove(9);
        System.out.println("    9  ?" + removeBoolean);

        /**
         * 9、size():           
         */
        Integer size = concurrentLinkedQueue.size();
        System.out.println("       :" + size);

    }
}

4、総括1、ConcerentLinked Que CAS非ブロッキングアルゴリズムを使用して、CASを使用して、現在のノードとnextノードの間のセキュリティリンクと現在の節点値の割り当てを解決しました.CASはロックを使用していないので、sizeを取得する際にはoffer、pollまたはremove操作が可能であり、取得した要素の個数が不正確であるため、併発の場合にはsize関数はあまり有用ではない.また、初めてpeekやfirstの時はheadを最初の本物のキュー要素に指します.2、ConcerentLinkedQueの中には2つのvolatileタイプのNodeノードがそれぞれリストの先頭ノードに存在するために使用されています.ここでheadノードはチェーンテーブルの最初のitemをnullとして保存しています.tailは常に最後のノードを指すわけではありません.Nodeノードの内部は、ノードの値を格納するために変数itemを維持し、nextは次のノードを格納するために使用され、一方向の非境界リストにリンクされる.