Che cos'è Semaphore in Java e come usarlo?

Pubblicato: 2022-05-26

Sun Microsystems nel 1995 ci ha portato Java, che era un linguaggio di programmazione collaborativo, dipendente da classi e oggetti e una piattaforma per computer. Un numero enorme di programmi e siti Web non funzionerà a meno che non sia installato Java e ne vengono sviluppati altri su base giornaliera. Java è commercializzato ed elogiato per la sua velocità, sicurezza e affidabilità. È un linguaggio informatico creato appositamente per l'uso nel mondo disperso di Internet. È stato realizzato tenendo presente il design del linguaggio di programmazione C++, ma è più facile da usare e impone un approccio di programmazione orientato agli oggetti.

Un programma PG esecutivo in Sviluppo software ti insegna esattamente tutte le competenze necessarie per eccellere in Java.

Esempio di un semaforo:

Condiviso var mutex: semaforo = 1;

Processo i

inizio

.

.

P(mutex);

eseguire CS;

V(mutex);

.

.

Fine;

Sommario

Cosa distingue Java?

Una comunità devota di sviluppatori Java, architetti e appassionati ha testato, perfezionato, ampliato e convalidato Java. Nonostante le sue radici di quasi due decenni, Java si è evoluta costantemente nel corso degli anni.

Java ha lo scopo di facilitare lo sviluppo di programmi portatili e ad alte prestazioni per un'ampia gamma di sistemi informatici, supportando così le nozioni essenziali di accessibilità e interazione multipiattaforma. Le aziende possono fornire servizi aggiuntivi, aumentare la produttività, la comunicazione e la collaborazione degli utenti finali e ridurre drasticamente i costi delle applicazioni aziendali e consumer rendendole disponibili in contesti eterogenei.

Che cos'è il semaforo in Java?

Un semaforo utilizza un contatore per regolare l'accesso a una risorsa condivisa. L'accesso è consentito se il contatore è maggiore di zero. Se il valore è 0, l'accesso viene rifiutato. Il contatore conta i permessi che forniscono l'accesso alla risorsa condivisa. Di conseguenza, per accedere alla risorsa, un thread deve prima ottenere l'autorizzazione dal semaforo.

Come funziona?

In genere, durante l'utilizzo di un semaforo, il thread che tenta di accedere alla risorsa condivisa tenta di ottenere l'autorizzazione. Se il conteggio del semaforo è maggiore di zero, il thread ottiene l'autorizzazione, causando la diminuzione del conteggio del semaforo. In caso contrario, il thread verrà interrotto fino all'ottenimento di un'autorizzazione.

Quando il thread non richiede più l'accesso alla risorsa condivisa, rilascia il permesso, facendo aumentare il conteggio del semaforo. Se un altro thread è in attesa di autorizzazione, quel thread ne riceverà uno in quel momento.

Tipi di semaforo

Ci sono quattro tipi di semaforo in Java. Sono i seguenti:

Semaforo binario :

Un semaforo binario accetta solo 0 e 1 come valori e viene utilizzato per creare l'esclusione reciproca e sincronizzare le attività simultanee.

Esempio di semaforo binario:

public class BinarySemaphoreExample

{

privato booleano bloccato = falso;

BinarySemaphore(int initial)

{

bloccato = (iniziale == 0);

}

public void sincronizzato waitForNotify() genera InterruptedException

{

mentre (bloccato)

{

aspettare();

}

bloccato = vero;

}

void sincronizzato pubblico notificationToWakeup()

{

se (bloccato)

{

notificare();

}

bloccato = falso;

}

}

Leggi i nostri articoli popolari relativi allo sviluppo software

Come implementare l'astrazione dei dati in Java? Che cos'è Inner Class in Java? Identificatori Java: definizione, sintassi ed esempi
Comprensione dell'incapsulamento in OOPS con esempi Spiegazione degli argomenti della riga di comando in C Le 10 principali caratteristiche e caratteristiche del cloud computing nel 2022
Polimorfismo in Java: concetti, tipi, caratteristiche ed esempi Pacchetti in Java e come usarli? Tutorial Git per principianti: impara Git da zero

Conteggio semaforo :

In ogni momento, il valore di un semaforo di conteggio rappresenta il numero massimo di processi che possono accedere contemporaneamente all'area critica.

Esempio di conteggio del semaforo:

public class CountingSemaphoreExample

{

segnale int privato = 0;

take void sincronizzato pubblico()

{

questo.segnale++;

this.notify();

}

public synchronized void release() genera InterruptedException

{

while(questo.segnale == 0)

aspettare();

questo.segnale–;

}

}

Semaforo a tempo:

I semafori temporizzati consentono a un thread di essere eseguito per un determinato periodo di tempo. Dopo un certo periodo, il timer si azzera e tutti gli altri permessi vengono rilasciati.

Esempio di semaforo temporizzato:

classe TimedSemaphoresExample

{

semaforo privato TimedSemaphore;

TimedSemaphoreExample(long period, int slotLimit)

{

semaphore = new TimedSemaphore(period, TimeUnit.SECONDS, slotLimit);

}

booleano tryAdd()

{

return semaphore.tryAcquire();

}

int disponibiliSlot()

{

return semaphore.getAvailablePermits();

}

}

Semaforo delimitato :

Possiamo impostare il limite superiore usando semafori limitati. Viene utilizzato al posto del conteggio dei semafori poiché non hanno un valore di limite superiore. Il valore del limite superiore rappresenta il numero massimo di segnali che possono essere memorizzati.

Esempio di semaforo limitato :

public class BoundedSemaphoresExample

{

segnali int privati ​​= 0;

limite int privato = 0;

public BoundedSemaphoreexample(int upperBound)

{

this.bound = limite superiore;

}

public void sincronizzato take() genera InterruptedException

{

while(this.signals == vincolato)

aspettare();

questo.segnali++;

questo.notifica++;

}

public void sincronizzato release() genera InterruptedException

{

while(questo.segnale == 0)

aspettare();

questo.segnali–;

}

}

Esplora i nostri corsi di ingegneria del software popolari

SL. No Programmi di sviluppo software
1 Master of Science in Informatica presso LJMU e IIITB Programma di certificazione di sicurezza informatica Caltech CME
2 Bootcamp di sviluppo full stack Programma PG in Blockchain
3 Executive Post Graduate Program in Software Development - Specializzazione in DevOps Visualizza tutti i corsi di ingegneria del software

Caratteristiche:

Un semaforo ha le seguenti caratteristiche:

  • Consente ai thread di comunicare tra loro.
  • Riduce il grado di sincronia. Di conseguenza, fornisce un metodo di sincronizzazione di basso livello.
  • Non vi è alcun valore negativo nel semaforo. Ha un valore che può essere maggiore o uguale a zero.
  • Possiamo implementare il semaforo usando l'operazione di test e gli interrupt ed eseguirlo usando i descrittori di file.

Pro e contro dei semafori:

vantaggi:

  1. Consente a molti fili di raggiungere la parte vitale.
  2. I semafori sono indipendenti dalla macchina.
  3. I semafori sono implementati nel codice indipendente dalla macchina del microkernel.
  4. Più processi non sono autorizzati ad accedere alla sezione cruciale.
  5. Non c'è spreco di tempo o risorse di processo poiché c'è sempre un'attesa impegnata nel semaforo.
  6. Sono indipendenti dalla macchina e pertanto dovrebbero essere eseguiti nel codice indipendente dalla macchina del microkernel.
  7. Consentono una gestione delle risorse adattabile.

Svantaggi:

  1. L'inversione di priorità è una delle restrizioni più significative di un semaforo.
  2. Il sistema operativo deve tenere traccia di tutte le chiamate di attesa e segnale semaforo.
  3. Il loro utilizzo non è mai obbligatorio, ma semplicemente per tradizione.
  4. Le azioni Wait e Signal devono essere eseguite correttamente per evitare deadlock nel semaforo.
  5. Poiché la programmazione del semaforo è complicata, esiste la probabilità che l'esclusione reciproca non possa essere raggiunta.
  6. Inoltre, non è una strategia realistica per applicazioni su larga scala poiché comporta una perdita di modularità.
  7. Il semaforo è più suscettibile agli errori di programmazione.
  8. Un errore di programmazione può causare un deadlock o una violazione dell'esclusione reciproca.

Come usare Semaphore come Lock?

Un semaforo può essere utilizzato come Lock in Java. Significa che limita l'accesso alla risorsa. Per acquisire il lock, qualsiasi thread che vuole accedere alla risorsa bloccata deve prima chiamare la funzione acquire(). Dopo aver completato il lavoro, il thread deve rilasciare il blocco invocando la funzione release(). Tieni presente che il limite superiore dovrebbe essere impostato su 1. Un corso PG per dirigenti in uno sviluppo completo ti aiuterà a padroneggiare tutte queste abilità.

Riepilogo

Avere un'idea chiara sui linguaggi di programmazione come Java è essenziale per una brillante carriera come sviluppatore di software. upGrad offre diversi corsi che potrebbero darti la spinta giusta per una carriera promettente. Una specializzazione in sviluppo full-stack presso la Purude University di upGrad ti insegnerà tutte le competenze necessarie per prosperare nel campo dello sviluppo software.

Impara i corsi di sviluppo software online dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.

Perché abbiamo bisogno di Semaphore in Java?

Un semaforo è una variabile utilizzata per la sincronizzazione dei processi per gestire processi simultanei. Previene anche un problema di razza controllando l'accesso a una risorsa condivisa da diversi processi simultanei.

Perché abbiamo bisogno del conteggio del semaforo?

I semafori vengono spesso utilizzati per coordinare l'accesso alle risorse, con il conteggio dei semafori impostato sull'elenco delle risorse totali. Quando le risorse vengono fornite o aggiunte, i thread aumentano il conteggio in modo atomico e quando le risorse vengono ritirate, i thread riducono il conteggio in modo atomico.

Perché Semaphore è noto come strumento di sincronizzazione?

Il semaforo è essenzialmente una variabile intera condivisa da molti thread. Questa variabile viene utilizzata nell'ambiente multiprocessing per superare il problema della sezione critica e stabilire la sincronizzazione del processo. Questo è talvolta indicato come un blocco mutex.

Che cos'è lo sviluppo full-stack?

Lo sviluppo full-stack consiste nella creazione di entrambi i componenti front-end (lato client) e back-end (lato server) di un'applicazione Web. Gli sviluppatori Web full-stack possono creare applicazioni e siti Web online a tutti gli effetti. Sono responsabili del front-end, del back-end, del database e del debug di applicazioni o siti Web online.