Javaのセマフォとは何ですか?



セマフォは、プロセスの同期に使用されます。このブログでは、Javaでのセマフォのさまざまなタイプと実装について説明します。

のセマフォ カウンターを介して共有リソースへのアクセスを制御します。それは スレッドの同期 スレッド間でシグナルを送信して、シグナルの欠落を回避したり、クリティカルセクションを保護したりするために使用される構造。 Javaのセマフォに関するこのブログでは、概念を詳細に理解します。
このブログでは、次のトピックについて説明します。

Javaのセマフォとは何ですか?

セマフォは、並行プロセスの管理に使用されるプロセスの同期に使用される変数です。また、複数の並行プロセスによる共通リソースへのアクセスを制御し、競合状態を回避するためにも使用されます。





セマフォの種類–

  • バイナリセマフォ: バイナリセマフォは、値として0と1のみを取り、相互排除を実装し、並行プロセスを同期するために使用されます。

  • セマフォのカウント: 任意の時点でのカウントセマフォの値は、まったく同時にクリティカルセクションに入ることができるプロセスの最大数を示します。



    ダブルをintにキャストします

セマフォの動作

  • セマフォカウントが0より大きい場合、スレッドは許可を取得し、セマフォのカウントを減らします。

  • そうでなければ、 許可を取得できるまでブロックされます。

  • スレッドが共有リソースにアクセスする必要がなくなると、許可が解放され、セマフォ数が増加します。



  • 別のスレッドが許可を待っている場合、そのスレッドはその時点で許可を取得します。

セマフォの実装

importjava.util.concurrent。* //リソースを共有クラスとして取得しますclassResource {static int count = 0} class MyDemo extends Demo {Semaphore sem String threadName public MyDemo(Semaphore sem、String threadName){super(threadName)this。 sem = sem this.threadName = threadName} @Override public void run(){// Run By X if(this.getName()。equals( 'X')){System.out.println( 'Starting' + threadName) try {//共有リソースへのアクセス許可を取得しますSystem.out.println(threadName + '許可を待機しています。')//ロックを取得しますsem.acquire()System.out.println(threadName + 'は許可を取得します。 ')//これで、共有リソースにアクセスして残りは待機します(int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

出力-
Xの開始
Yを開始
Xは許可を待っています
Yは許可を待っています
X:1
X:2
X:3
X:4
X:5
X:6
X:7
Xは許可を解放します
Yは許可を取得します
Y:6
Y:5
Y:4
Y:3
Y:2
Y:1
Y:0
そしてリリース許可
カウント:0

これで、「Javaのセマフォ」に関するこのブログは終わりです。 Javaについて詳しく知りたい場合は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、HibernateやSpringなどのさまざまなJavaフレームワークに加えて、コアと高度なJavaの両方の概念についてトレーニングします。

質問がありますか?この「Javaのセマフォとは」ブログのコメントセクションにそのことを記載してください。できるだけ早くご連絡いたします。