Čo je Semafor v Jave a jeho použitie?



Na synchronizáciu procesov sa používa semafor. Tento blog vás prevedie rôznymi typmi a implementáciou semaforov v Jave.

Semafor v riadi prístup k zdieľanému prostriedku prostredníctvom počítadla. Je to synchronizácia vlákien konštrukt používaný na vysielanie signálov medzi vláknami, aby sa zabránilo zmeškaným signálom alebo aby sa chránil kritický úsek. V tomto blogu o Semaphores v Jave podrobne pochopíme tento koncept.
V tomto blogu sa budeme venovať nasledujúcim témam:

Čo je semafor v Jave?

Semafor je premenná používaná na synchronizáciu procesov, ktorá sa používa na správu súbežných procesov. Používa sa tiež na riadenie prístupu k spoločnému prostriedku viacerými súbežnými procesmi a na zabránenie stavu rasy.





Typy semaforu -

  • Binárny semafor: Binárny semafor má iba hodnoty 0 a 1 a používa sa na implementáciu vzájomného vylúčenia a na synchronizáciu súbežných procesov.

  • Počítanie semaforu: Hodnota počítacieho semaforu v ktoromkoľvek bode označuje maximálny počet procesov, ktoré môžu vstúpiť do kritickej sekcie v rovnakom čase.



    čo je flume v hadoop

Fungovanie Semaforu

  • Ak počet semaforov> 0, vlákno získa povolenie, ktoré zníži počet semaforov.

  • Inak je zablokovaný, kým nebude možné získať povolenie.

  • Keď vlákno už nepotrebuje prístup k zdieľanému prostriedku, uvoľní povolenie a zvýši počet semaforov.



    cast double na int java
  • Ak iné vlákno čaká na povolenie, potom dané vlákno v tom čase získa povolenie.

Implementácia semaforu

import java.util.concurrent. * // Bude zdroj brať ako triedu zdieľanej triedy Zdroj {static int count = 0} trieda MyDemo rozširuje ukážku {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) toto. sem = sem this.threadName = threadName} @Override public void run () {// Spustiť podľa X if (this.getName (). equals ('X')) {System.out.println ('Starting' + threadName) skúste {// Získať povolenie na prístup k zdieľanému prostriedku System.out.println (threadName + 'čaká na povolenie.') // získanie zámku sem.acquire () System.out.println (threadName + 'získa povolenie . ') // Teraz bude prístup na zdieľaný zdroj a zvyšok čakať na (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) } } 

Výkon-
Počnúc X
Počiatočné Y
X čaká na povolenie
Y čakanie na povolenie
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X povolenie uvoľní
Y dostane povolenie
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
A vypúšťa povolenie
počet: 0

Týmto prichádzame na koniec tohto blogu o „Semaforoch v Jave“. Ak sa chcete dozvedieť viac informácií o prostredí Java, pozrite si stránku autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je určený pre študentov a profesionálov, ktorí chcú byť vývojármi Java. Kurz je navrhnutý tak, aby vám dal náskok v programovaní v Jave a naučil vás základné aj pokročilé koncepty Javy spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to, prosím, v sekcii komentárov v tomto blogu „Čo je Semafor v Jave“ a my sa vám ozveme čo najskôr.