Apa itu Semaphore di Java dan penggunaannya?



Semaphore digunakan untuk penyegerakan proses. Blog ini akan memandu anda melalui berbagai jenis dan pelaksanaan semaphores di java.

Sebuah Semaphore di mengawal akses ke sumber yang dikongsi melalui kaunter. Ia adalah penyegerakan benang konstruk yang digunakan untuk menghantar isyarat antara utas untuk mengelakkan isyarat terlewat atau menjaga bahagian kritikal. Dalam blog ini di Semaphores di Jawa, kita akan memahami konsepnya secara terperinci.
Topik berikut akan dibahas dalam blog ini:

Apa itu Semaphore di Jawa?

Semaphore adalah pemboleh ubah yang digunakan untuk penyegerakan proses yang digunakan untuk menguruskan proses serentak. Ini juga digunakan untuk mengawal akses ke sumber bersama dengan beberapa proses serentak dan mengelakkan keadaan perlumbaan.





Jenis semaphore -

  • Semaphore binari: Semaphore binari hanya mengambil 0 dan 1 sebagai nilai dan digunakan untuk melaksanakan pengecualian bersama serta menyegerakkan proses serentak.

  • Mengira semaphore: Nilai semafore pengiraan pada bila-bila masa menunjukkan bilangan maksimum proses yang dapat memasuki bahagian kritikal pada waktu yang sama.



    cara menangani pop timbul dalam pemacu web selenium

Bekerja di Semaphore

  • Sekiranya bilangan semaphore> 0, utas memperoleh izin, mengurangkan jumlah semaphore.

  • Lain, yang disekat sehingga izin dapat diperoleh.

  • Apabila utas tidak lagi memerlukan akses ke sumber yang dikongsi, ia melepaskan izin, menambah jumlah semaphore.



  • Sekiranya benang lain sedang menunggu izin, maka utas itu akan memperoleh izin pada masa itu.

Pelaksanaan Semaphore

import java.util.concurrent. * // Akan mengambil Sumber sebagai kelas kelas bersama Sumber {static int count = 0} kelas MyDemo meluaskan Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) ini. sem = sem this.threadName = threadName} @ Override public void run () {// Run By X if (this.getName (). sama dengan ('X')) {System.out.println ('Start' + threadName) cuba {// Akan mendapat izin untuk mengakses sumber yang dikongsi System.out.println (threadName + 'menunggu izin.') // memperoleh kunci sem.acquire () System.out.println (threadName + 'mendapat izin . ') // Sekarang, mengakses sumber yang dikongsi dan rehat akan menunggu (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) } } 

Pengeluaran-
Bermula X
Bermula Y
X menunggu izin
Y menunggu izin
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X melepaskan izin
Y mendapat permit
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Dan melepaskan izin
kiraan: 0

Dengan ini, kita mengakhiri blog ini di 'Semaphores in Java'. Sekiranya anda ingin mempelajari lebih lanjut mengenai Java, lihat di oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kursus latihan dan pensijilan Java J2EE dan SOA Edureka dirancang untuk pelajar dan profesional yang ingin menjadi Pembangun Java. Kursus ini dirancang untuk memberi Anda awal dalam pengaturcaraan Java dan melatih anda untuk konsep Java teras dan maju bersama dengan pelbagai kerangka kerja Java seperti Hibernate & Spring.

tutorial spring mvc untuk pemula

Ada soalan untuk kami? Sila sebutkan di bahagian komen blog 'Apa itu Semaphore di Jawa' dan kami akan menghubungi anda secepat mungkin.