Vad är Semaphore i Java och dess användning?



En semafor används för synkronisering av processer. Denna blogg ger dig information om olika typer och implementering av semaforer i Java.

En semafor i styr åtkomst till en delad resurs via en räknare. Det är en trådsynkronisering konstruktion används för att skicka signaler mellan trådar för att undvika missade signaler eller skydda ett kritiskt avsnitt. I den här bloggen om Semaphores i Java kommer vi att förstå konceptet i detalj.
Följande ämnen kommer att behandlas i den här bloggen:

Vad är Semaphore i Java?

En semafor är en variabel som används för synkronisering av processer som används för att hantera samtidiga processer. Det används också för att kontrollera åtkomst till en gemensam resurs genom flera samtidiga processer och undvika ett loppstillstånd.





Typer av semafor -

  • Binär semafor: En binär semafor tar bara 0 och 1 som värden och används för att implementera ömsesidig uteslutning samt synkronisera samtidiga processer.

    java vad är en token
  • Räknar semafor: Värdet av en räknande semafor vid vilken punkt som helst anger det maximala antalet processer som kan komma in i det kritiska avsnittet vid exakt samma tidpunkt.



Arbeta med Semaphore

  • Om semafor räknas> 0, får tråden ett tillstånd, vilket minskar semaforens räkning.

    datadrivet ramverk i exempel på selen webdriver
  • Annars, den blockeras tills ett tillstånd kan förvärvas.

  • När tråd inte längre behöver åtkomst till en delad resurs släpper den tillståndet och ökar semaforantalet.



  • Om en annan tråd väntar på tillstånd kommer den tråden att få tillstånd vid den tiden.

Implementering av Semaphore

importera java.util.concurrent. * // Tar resurs som delad klassklass Resurs {static int count = 0} klass MyDemo utökar demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) detta. sem = sem this.threadName = threadName} @ Override public void run () {// Kör av X om (this.getName (). är lika med ('X')) {System.out.println ('Startar' + trådnamn) prova {// Får tillstånd att få tillgång till delad resurs System.out.println (threadName + 'väntar på tillstånd.') // förvärv av låset sem.acquire () System.out.println (threadName + 'får tillstånd . ') // Nu kommer åtkomst till den delade resursen och vila vänta på (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) } } 

Produktion-
Startar X
Börjar Y
X väntar på tillstånd
Y väntar på tillstånd
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X släpper tillståndet
Y får tillståndet
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Och släpper tillstånd
räkna: 0

pl sql tutorial för nybörjare med exempel

Med detta kommer vi till slutet på denna blogg om ”Semaforer i Java”. Om du vill lära dig mer om Java, kolla in av Edureka, ett pålitligt inlärningsföretag online med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för studenter och yrkesverksamma som vill vara Java-utvecklare. Kursen är utformad för att ge dig ett försprång till Java-programmering och träna dig för både kärn- och avancerade Java-koncept tillsammans med olika Java-ramverk som Hibernate & Spring.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i denna 'Vad är Semaphore i Java' -bloggen så kommer vi tillbaka till dig så snart som möjligt.