セマフォは共有ロック、広くロック考えることができ、
セマフォのように理解することができるセマフォ、制御リソースのスレッドの数は、特定のリソースを合理的に使用することができることを確実にするために、同時に複数のスレッドをアクセスすることができます。セマフォは、ライセンスに相当し、スレッドは、スレッドがダウンし続けることができ、取得法によりライセンスを取得する必要がある、または方法で待っているブロックのみ。ビジネス機能の実装が完了した後、我々は必要なrelease()
他のスレッドを続行するにはライセンスを取得することができるように、ライセンスを返却する方法を。
セマフォは、特に公共資源、データベース接続などの限られたアプリケーションシナリオ、トラフィック制御を行うために使用することができます。データを読み出す複数のスレッドが存在する場合、データはデータベースに格納される必要があるが、唯一の最大値は、使用可能なデータベース接続10は、この時点では、データベースへのセマフォ同時アクセスが10リソースの唯一最大に接続することができるスレッドの数を制御する必要がA。リソースのアプリケーションシナリオの使用を制限するには、セマフォは特に適しています。
これは、複数のスレッドが1たときの値に対応するクリティカルセクションを入力することを可能にします。
パブリック クラス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フィニッシュは、ペンを返されました!!!!!!
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を