Javaの並行処理ツール-Semaphore、交換

セマフォは共有ロック、広くロック考えることができ、

セマフォのように理解することができるセマフォ、制御リソースのスレッドの数は、特定のリソースを合理的に使用することができることを確実にするために、同時に複数のスレッドをアクセスすることができます。セマフォは、ライセンスに相当し、スレッドは、スレッドがダウンし続けることができ、取得法によりライセンスを取得する必要がある、または方法で待っているブロックのみ。ビジネス機能の実装が完了した後、我々は必要なrelease()他のスレッドを続行するにはライセンスを取得することができるように、ライセンスを返却する方法を。

セマフォは、特に公共資源、データベース接続などの限られたアプリケーションシナリオ、トラフィック制御を行うために使用することができます。データを読み出す複数のスレッドが存在する場合、データはデータベースに格納される必要があるが、唯一の最大値は、使用可能なデータベース接続10は、この時点では、データベースへのセマフォ同時アクセスが10リソースの唯一最大に接続することができるスレッドの数を制御する必要がA。リソースのアプリケーションシナリオの使用を制限するには、セマフォは特に適しています。

これは、複数のスレッドが1たときの値に対応するクリティカルセクションを入力することを可能にします。

特定の使用セマフォを示すために、ここでは簡単な例。だから我々は、同じシナリオをシミュレートする必要があります。ある日、先生はそれゆえ、唯一の学生がペンに取得していない、唯一の5つの学生はペンを取得し、フォームに必要事項を記入することができ、同じ時間を保証することができ、10人が表彰台にフォームに必要事項を記入、だけ教師が5本のペンを用意したクラスを必要とします学生だけでは、フォームに記入してペンを得るために、前回の実行後に待つことができます。次のサンプルコード:
パブリック クラスSemaphoreDemo { 

    // のみ10ペン教師表す
    プライベート 静的セマフォセマフォ= 新しい新しいセマフォ(5。 

    パブリック 静的 ボイドメイン(文字列[]引数){ 

        //は50人の学生表し 
        ExecutorServiceの= Executors.newFixedThreadPool-サービス(10 )。
         以下のためにint型 ; IはI = 0 <10; I ++は){ 
            service.execute(() - > {
                 試み{ 
                    System.out.printlnは(にThread.currentThread()のgetName()。 +「準備の学生を取得します....ペン.. " );
                    Semaphore.acquire(); 
                    System.out.printlnは(。にThread.currentThread()のgetName() + "学生がペンに取得する"); 
                    。System.out.printlnは(にThread.currentThread()のgetName() +「フォームのINGを記入..... "); 
                    TimeUnit.SECONDS.sleep( 3);
                    semaphore.release(); 
                    System.out.printlnは(にThread.currentThread()。のgetName() +"フォームに記入するには、ペンを返します! ! "); 
                } キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 
            }); 
        } 
        service.shutdown(); 
    }

} 
出力:

プール -1-スレッド-1   学生の準備ができてペンを得る...... 
プール -1-スレッド-1   学生はペンに着く
プール -1-スレッド-1は  ..... INGのフォームに必要事項を記入し
、プール -1 -thread-2   の学生が準備ペン......入手
プール -1-スレッド-2   学生がペンに着く
プール -theスレッド2が-1-   フォームに必要事項を記入..... INGは、
プール -1-スレッド-3   学生が準備を......ペン
プール -1-スレッド4-   学生が......取得ペンを用意し
、プールを -1。3 -スレッド  学生のペンは、取得した
プール -1-スレッドを4-   学生のペンは、取得した
プールを -1-スレッド4   フィル形態..... ING 
プール -1。3-スレッドは、  フォームを埋める..... ING 
プール-1-スレッド-5   学生の準備ができてペンを得る...... 
プール -1-スレッド-5   の学生は、ペンに着く
プール -1-スレッド-5を  フォームに記入..... ING 


プール -1-スレッド6   学生準備ペン......入手
プール -1-スレッド-7   学生が準備ペンを得る...... 
プール -1-スレッド-8   学生の準備ができてペンを得る...... 
プール -1-スレッド-9を  学生が準備ペンを得る...... 
プール -1-スレッド-10   学生の準備ができてペンを得る...... 


プール -1-スレッド-4は、  ペンを返す、フォームに必要事項を記入すること!
プール -1-スレッド9   学生がペンに着く
プール -1-スレッド-9は、  フォームに必要事項を記入..... ING 
プール -1-スレッド-5   フォームに記入し、ペンを返します!
プール -1-スレッド7-  学生はペンに着く
プール -1-スレッド-7は、  ING .....フォームに必要事項を記入
プール -1-スレッド-8   学生がペンに着く
プール -1-スレッド-8は、  ING .....フォームに必要事項を記入し
、プール -1-スレッド-1   フォームに記入し、ペンを返します!
プール -1-スレッド6   学生がペンに着く
プール -1-スレッド-6は、  フォームに必要事項を記入..... ING 
プール -1-スレッド-3は、  ペンを返す、フォームに必要事項を記入!
プール -1-スレッド-2は、  ペンを返し、フォームを記入しました!
プール -1-スレッド・10   学生がペンに取得するには、
プール -1-スレッド-10は、  フォームに必要事項を記入..... ING 
プール -1-スレッド-7   のペンを返す、フォームに必要事項を記入すること!
プール -1-スレッド9-    ペンを返し、フォームを記入しました!
プール -1-スレッド-8   フォームに記入し、ペンを返します!
プール -1-スレッド-6は、  ペンを返し、フォームを記入しました!
プールのフォームに必要事項を記入-1-スレッド-10フィニッシュは、ペンを返されました!
分析出力の結果によると、許可されたライセンスのセマフォの最大数は、同時に5を実行するスレッドの最大許容数は、それを見ることができる、最初の5つのスレッド(最初の5人の学生が)、その後、ペンを取得中に埋めることをしている、5ですテーブル、および6-10 5つのスレッド、許可を得ていない原因は、あなただけの待機をブロックすることができます。ときに、スレッドは、 pool-1-thread-4 ライセンスのリリース後、 pool-1-thread-9 あなたは、実装をダウン継続する許可を得ることができます。同じ理由から、他のスレッドの実行です。この例から見ることができ、 セマフォは、特定のリソース制御への同時アクセスのために使用されるフロー制御ビジネスシナリオの必要性がある場合には、非常に適切である、セマフォに優先順位を付けることができます。
 
交換

スレッド間でデータを交換するため。なお、この同期点において、2つのスレッドが相互にデータを交換することができ、同期点を提供します。交換データの交換方法にこれら2つのスレッドが、第二のスレッドを待っている最初のスレッドが交換を実行する場合()メソッドは、また、2つのスレッドが同期点に到達したときに、これら2つのスレッドの交換方法を実行しますデータは、互いにデータを生成した。この糸を通すこと、交換することができます。

交換器は、SynchronousQueueの双方向形式とみなすことができます。交換器は、遺伝的アルゴリズムとパイプライン設計用途において有用です。

メモリ一貫性:スレッドの各ペアが正常交換器を通ってオブジェクトを交換するため、その後の動作中の各スレッドが起こる前に、交換動作を交換()リターンから別のスレッドに対応する)(前。

方法:

1      // (現在のスレッドが中断されていない場合)、別のスレッドがこの交換ポイントに到達するのを待って、その後、スレッドに指定されたオブジェクト、受信対象のスレッドに送信されます。
2      公共 V取引所(V X)がスローInterruptedExceptionあるが
。3      // 、指定した時間の経過タイムアウトメカニズムを増やす例外TimeoutExceptionを投げる 
。4      パブリック V取引所(V X、ロングタイムアウト、TimeUnitでユニット)がスロー InterruptedExceptionある、TimeoutExceptionを

 





リンクします。https://juejin.im/post/5aeec49b518825673614d183

おすすめ

転載: www.cnblogs.com/dingpeng9055/p/11303927.html