I.概要
ConcurrentLinkedQueueは「高い同時実行」のシーンに適用されるスレッドセーフなキューです。
リンクノードに基づく、アンバウンド形式のスレッドセーフなキューはFIFO(先入れ先出し)で、原則としてソート要素に応じて、です。キュー要素に(特殊なノード内部実装を除く)がnull要素を配置されています。
1.1、原則とデータ構造
説明:
1. ConcurrentLinkedQueueはAbstractQueueから継承されました。
2. ConcurrentLinkedQueue内部は、リンクされたリストによって達成されます。また、リストのヘッドノードとテール・ノード尾の頭が含まれています。FIFO(先入れ先出しで)原則に従ってソートConcurrentLinkedQueue要素。要素は尾からのリストに挿入され、頭部から戻るようになりました。
次のタイプノード3 ConcurrentLinkedQueueリストは揮発性であり、データ項目タイプのリストは、揮発性です。「この揮発性変数ことがvolatile変数に読み込まれ、常に(任意のスレッド)を見ることができ、最後の書き込み。」:について私たちは、それは意味が含ま知っている、揮発性 ConcurrentLinkedQueueは、揮発性により、リソースの競合にマルチスレッドの排他的アクセスを達成することです。
1.2例
/ * LinkedListのは、スレッドセーフではないながら* ConcurrentLinkedQueueは、「スレッドセーフ」キューです。 * *以下は、「複数のスレッドが同時に動作し、キューをトラバース」の一例です *(01)キューがConcurrentLinkedQueueオブジェクトであるとき、プログラムが正常に実行することができます。 キューがLinkedListのオブジェクトであるとき*(02)、プログラムはConcurrentModificationExceptionが例外を生成します。 * * / パブリック・ クラスConcurrentLinkedQueueDemo1 { // TODO:キューはLinkedListのオブジェクトである場合には、プログラムが間違って行くでしょう。 // プライベート静的キュー<文字列> =新しい新しいキューのLinkedList <文字列>(); プライベート 静的キュー<文字列>キュー= 新しい新しい ConcurrentLinkedQueue <文字列> (); パブリック 静的 ボイドメイン(文字列[]引数){ // 同じ時間は動作するキューに2つのスレッドを開始します! 新しい新 MyThread( "TA" ).start(); 新しい新 MyThread( "TB" ).start(); } プライベート 静的 無効のprintAll(){ String値。 反復子ITER = queue.iterator()。 一方、(iter.hasNext()){ 値 = (文字列)iter.next(); System.out.print(値 + "" )。 } System.out.println(); } プライベート 静的 クラス MyThreadは拡張スレッドを{ MyThread(文字列名){ スーパー(名); } @オーバーライド 公共 ボイドラン(){ int型 I = 0を。 一方、(I ++ <6 ){ // 「线程名」+ " - " + "序号" 。文字列のval =にThread.currentThread()のgetName()+ I。 queue.add(ヴァル)。 // 「イテレータ」でキューを通過します。 printAll(); } } } }
結果は示して:あなたは、キューのLinkedListオブジェクトのソースコードを変更すると、プログラムはConcurrentModificationExceptionが例外を生成します。
1.3利用シナリオ
第二に、ソースコード解析
道