一部のJavaと契約

同期コンテナ

ベクトルとArayList

        リストArrayListのが最も一般的な実装クラスで、内部は高速なランダムアクセスを可能要素のアレイによって達成されます。配列のサイズは、ストレージ容量を増やす必要性を満たさない場合、配列は各要素の間にスペースを持つことができないということです、話すことが必要である欠点は、データ・ストレージ・スペースの新しい配列にコピーされています。ArrayListの中間位置から要素を挿入または削除する場合、アレイは、移動をコピーする必要があり、コストが比較的高いです。したがって、それは、挿入や削除のために適しランダム探索とトラバーサルには適していません。

        ベクターおよびArrayListのように、それは同期のスレッドをサポートすることを除いて、配列によって達成される時に1つだけのスレッドが、ベクタを書く引き起こした矛盾を書きながら、マルチスレッドを避けるが、同期は非常に高いコストを必要とすることができますしたがって、アクセス、アクセスのArrayListよりも遅くなります。ベクターおよびArrayListの拡大がベクトル能力を倍増するために、デフォルトの展開で、同じではありません、ArrayListの50%の容量の増加

注意:ベクトルスレッドセーフ、ArrayListを

Vector.add出典:

                      

ArrayList.add出典:

                 

したがって、それが見られ、Vectory方法は、スレッド同期書き込ま同期同期機能メソッドを使用します。

HashMapの和ハッシュテーブル:

スレッドセーフではない1.HashMap、HastMapサブインターフェースは、オブジェクトはキーと値がオブジェクトであり、重複キーを含めることはできませんが、重複値を含んでいてもよく、キー値にマッピングされ、インターフェース・マップ・インターフェースです。HashMapのがnullキーやnull値を許容し、ハッシュテーブルが許可されていません。

2.HashTableコレクションは、スレッドセーフです。

3.HashMapハッシュテーブルは、軽量を実現(非スレッドセーフな実装)である、彼らはMapインタフェースを完了している、主な違いは、HashMapのは、非スレッドセーフのために(キー)はnull(ヌル)キーを、可能にする、効率がより高くなるかもしれないということですハッシュテーブル。
HashMapのは、キー入力または値としてnullを許容し、Hashtableの許可されていません。
HashMapのハッシュテーブルは、削除メソッドが含まれているのcontainsValueのcontainsKeyを置き換えます。

注:ハッシュテーブルスレッドセーフ、HashMapのスレッドセーフ。この方法は、実装された同期方法を使用しても同期ハッシュテーブルのソースを入れて

synchronizedMap

      同期ブロックを使用したソースコードは、スレッドセーフなコレクションの量は、スレッドセーフなコレクションとなって

      例:Collections.synchronizedMap(HashMapの)、HashMapのスレッドの同期となります

ConcurrentHashMapの

      ConcurrentMapインターフェイスの下に2つの重要な実現があります。

  1. ConcurrentHashMapの
  2. ConcurrentSkipListMapの(同時ソートをサポートしています。ConcurrentHas HMA pをメイクアップ)

      ConcurrentHashMapの内部で使用するセグメント(セグメント)は、これらの異なるセクションを表すために、各セクションは、彼らが彼ら自身のロックを持って、実際に小さなハッシュテーブルです。限り、複数の改変が、異なるセグメントで発生するように、それらが複雑にすることができます。全体このシーン重いスレッドロック粒度は、それによって溶液のロック競合を低減する低減さもある。16個のセグメント(セグメント。オペレーションを修正する、すなわち、最大16の同時スレッドに分割されている。コードと共有変数のほとんど目的は、コンテンツの変更に初めてアクセスされ、パフォーマンスが非常に良いですが、揮発性のキーワードステートメントを使用しています。(java8後、代わりにCASアルゴリズムを使用して、セグメントの概念を放棄しました

ConcurrentHashMapのの方法が原因効率に明らかであるのsynchronizedMap

 

たCountDownLatch

       機能的に類似のカウンタを使用して実施することができるパッケージの下に配置たCountDownLatchクラスjava.util.concurrentの、。たとえば、あなたがたCountDownLatchを達成するために、この機能を使用することができ、他に実行するために4つのタスクの完了後に実行することが待機し、タスクAがあります。

パブリック クラスtest002 { 

    公共の 静的な 無効メイン(文字列[] argsが)スローInterruptedExceptionあるが、{ 
        System.out.printlnは( "子スレッドが待機を完了した..." ); 
        たCountDownLatchたCountDownLatch = 新新たCountDownLatch(2 );
         新しい新しいスレッド(新しい新しいRunnableを( ){ 

            @Override 
            公共 ボイドRUN(){ 
                System.out.printlnは( "子スレッド、" +にThread.currentThread(。)のgetName( )+ " 開始..." ); 
                countDownLatch.countDown(); // 各マイナス1倍
                System.out.println( "子スレッド、" +にThread.currentThread()のgetName( )+ " 実行の終わり..." ); 
            } 
        })を起動(); 
        新しい新しいスレッド(新しい新しいRunnableを(){ 

            @Override 
            公衆 無効RUN(){ 
                System.out.printlnは(。 "子スレッド、" +にThread.currentThread()のgetName( )+ " 始まる..." ); 
                countDownLatch.countDown(); 
                System.out.printlnは(「サブスレッド、 "+にThread.currentThread()のgetName ()+" 実行の終わり... " ); 
            } 
        })を起動();. 

        CountDownLatch.await(); // メインスレッドカウントダウン結果が0であるブロックの現在の方法と呼ばれます、ブロッキングは、動作状態となり
        System.out.println( "二つのサブスレッドの実行完了...." ); 
        のSystem.out.printlnは( "メインスレッドは実行を継続します.." ); 
    } 

}

 

CyclicBarrierを

その後、初期化CyclicBarrierを数の規定、および待機中のスレッドの数を入力するために、コールCyclicBarrier.await()を計算します。スレッドの数がこの数に達した場合、待機状態へのすべてのスレッドが目を覚ますと続きます。 

 その名のようにCyclicBarrierを、すべてのスレッドが一緒にこの障害を渡すために一緒に得た後に、障害物として見ることができるように、を意味します。 

CyclicBarrierをも初期のRunnableのパラメータで、CyclicBarrierを番号の後、このRunnableをタスクは、他のすべてのスレッドが目覚めされる前に実行されるように、到達しました。

クラス Writerは拡張スレッド{
     プライベートCyclicBarrierをCyclicBarrierをします。
    公共ライター(CyclicBarrierをCyclicBarrierを){
          この .cyclicBarrier = CyclicBarrierを。
    } 
    @Override 
    公共 ボイドラン(){ 
        System.out.printlnは( "线程" +にThread.currentThread()のgetName()+ "正在写入数据"。 )。
        試す{ 
            のThread.sleep( 3000 )。
        } キャッチ(例外e){
             // TODO:ハンドル例外
        } 
        のSystem.out.println("スレッド" +にThread.currentThread()のgetName() + " 書き込みデータが......正常である" ); 
        
        試み{ 
            CyclicBarrier.await(); 
        } キャッチ(例外E){ 
        } 
        のSystem.out.println( "すべてのスレッドが..........終了する" ); 
    } 

} 

パブリック クラスtest001 { 

    公共 静的 ボイドメイン(文字列[]引数){ 
        CyclicBarrierをCyclicBarrierを = 新しい新しい CyclicBarrierを(5 のためのINT I = 0 ;私は<5; Iは++ ){ 
            ライターライター = 新しい新ライター(CyclicBarrierを); 
            writer.start(); 
        } 
    } 

}

 

セマフォ

セマフォは、ベースカウンティングセマフォです。それは、信号の複数のスレッドが返還のための彼らの適用後に行うためのライセンスを取得するために競争し、これに基づいて、しきい値を設定することができ、閾値を超えた後、スレッドは、信号がブロックされている許可の申請をします。セマフォオブジェクトは、データベース接続のプールとしてプールの一部、リソースのプール等を構築するために使用することができ、我々は、セマフォのカウントを作成することができる。1、ミューテックスと同様の機構として、の量も示すバイナリフラグと呼ばれ二つの相互に排他的な状態。これは次のように使用されます。

availablePermitsは、現在利用可能なリソースの数を取得するために機能します

wc.acquire(); //アプリケーション・リソース

wc.release(); //リリースリソース

例:

        トイレは3つしかピットビットが、トイレに10人があり、どのようにしますか?トイレに最終的にそれぞれの人10〜10の数、およびトイレの第1まず、10としたとします。そして、必然的に1-3利用可能ピットビットが来た、よくトイレに行く、4番は誰か出ている場合には、誰もアウトかどうかを確認する必要がある、または待つ3人の前で来ました。同様に、第4-10はまた、人々のトイレを待っているで行くことに出てきた、そして誰がそれに行く必要がある人は、それは先着最初のルールを遵守することができるかどうか、品質を待つ必要があるかどうかに依存します。(RPM)

パブリック クラス{SemaphoreTest
     パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 


     / *    //リソースアクセスの数をサポートするために、最大表し、
        セマフォセマフォ=新しい新しいセマフォを(3); 
        //アプリケーションリソース
        wc.acquire(); 
        //リソース解放
        semaphore.releaseを(); / * 
        セマフォセマフォ = 新しい新しいセマフォ(3。 のためにint型 = 0 Iを、I = 10 <; I ++は){
          新しい新しい Prarent(セマフォ、 "第二" + i "は番目の" + .start)を(); 
     } 
    } 
} 

クラス Prarent延びスレッド{ 

   セマフォWC、
   文字列名; 

    公共Prarent(セマフォWC、文字列名){
         この .wc = WC;
         この .nameの= 名; 
    } 

    @Override 
    公共 ボイドRUN(){
         // リソースを取得した後、すぐにマイナス1 、例えば5-1のような、代わりwc.acquireの(); 
       int型 A = wc.availablePermits();
        IF(A> 0 ){ 
           System.out.printlnは(名 + "がピット" ); 
       } { 
           のSystem.out .println(名前 + "ノーピット" ); 
       } 
        試み{ 
            Wc.acquire(); 
            System.out.printlnは(名前 + "ピットを得る" ); 
            のThread.sleep(新しい新しいランダム()nextInt(1000 )); 
            System.out.printlnは(名前 + "オーバー" ); 
        } キャッチ(InterruptedExceptionあるE){ 
            e.printStackTrace(); 
        } 最後に{
             // 解放リソース
            wc.release(); 
        } 
    } 
}

 

 

おすすめ

転載: www.cnblogs.com/QSC-AcStu/p/11330438.html