Un semaforo in controlla l'accesso a una risorsa condivisa tramite un contatore. È un sincronizzazione dei thread costrutto utilizzato per inviare segnali tra thread per evitare segnali mancanti o proteggere una sezione critica. In questo blog sui semafori in Java, capiremo il concetto in dettaglio.
I seguenti argomenti verranno trattati in questo blog:
- Cosa sono i semafori in Java?
- Tipi di semafori
- Funzionamento del semaforo
- Implementazione del semaforo
Cos'è il semaforo in Java?
Un semaforo è una variabile utilizzata per la sincronizzazione dei processi che viene utilizzata per la gestione dei processi simultanei. Viene anche utilizzato per controllare l'accesso a una risorsa comune da più processi simultanei ed evitare una condizione di competizione.
ordina i numeri c ++
Tipi di semaforo -
Semaforo binario: Un semaforo binario accetta solo 0 e 1 come valori e viene utilizzato per implementare l'esclusione reciproca e sincronizzare i processi simultanei.
Conteggio del semaforo: Il valore di un semaforo di conteggio in qualsiasi punto indica il numero massimo di processi che possono entrare nella sezione critica nello stesso identico momento.
Funzionamento del semaforo
Se il conteggio del semaforo> 0, il thread acquisisce un permesso, diminuendo il conteggio del semaforo.
Altrimenti, il è bloccato fino all'acquisizione di un permesso.
Quando il thread non necessita più dell'accesso a una risorsa condivisa, rilascia il permesso, incrementando il conteggio dei semafori.
Se un altro thread è in attesa di un permesso, quel thread acquisirà un permesso in quel momento.
Implementazione del semaforo
import java.util.concurrent. * // Prenderà Resource come classe di classe condivisa Resource {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 {// Otterrà il permesso di accedere alla risorsa condivisa System.out.println (threadName + 'in attesa di un permesso.') // acquisendo il blocco sem.acquire () System.out.println (threadName + 'ottiene un permesso . ') // Ora, l'accesso alla risorsa condivisa e rest aspetterà (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) } }
Produzione-
Avvio di X
Avvio di Y
X in attesa di un permesso
Stai aspettando un permesso
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X rilascia il permesso
Y ottiene il permesso
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
E il permesso di rilascio
conteggio: 0
qual è l'istanza di una classe in java
Con questo, arriviamo alla fine di questo blog sui 'Semafori in Java'. Se desideri saperne di più su Java, controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per studenti e professionisti che desiderano diventare sviluppatori Java. Il corso è progettato per darti un vantaggio nella programmazione Java e formarti per concetti Java sia di base che avanzati insieme a vari framework Java come Hibernate e Spring.
Hai domande per noi? Per favore, menzionalo nella sezione commenti di questo blog 'Che cos'è il semaforo in Java' e ti risponderemo il prima possibile.