Co to jest semafor w Javie i jego zastosowanie?



Do synchronizacji procesów służy semafor. Ten blog przeprowadzi Cię przez różne typy i implementacje semaforów w Javie.

Semafor w kontroluje dostęp do współdzielonego zasobu poprzez licznik. To jest synchronizacja wątków konstrukcja używana do przesyłania sygnałów między wątkami w celu uniknięcia utraty sygnałów lub ochrony krytycznej sekcji. W tym blogu poświęconym semaforom w Javie szczegółowo zrozumiemy tę koncepcję.
Na tym blogu zostaną omówione następujące tematy:

Co to jest semafor w Javie?

Semafor to zmienna używana do synchronizacji procesów, która służy do zarządzania współbieżnymi procesami. Służy również do kontrolowania dostępu do wspólnego zasobu przez wiele współbieżnych procesów i unikania sytuacji wyścigu.





funkcja Fibonacciego c ++

Rodzaje semaforów -

  • Semafor binarny: Semafor binarny przyjmuje tylko wartości 0 i 1 i jest używany do implementacji wzajemnego wykluczania, a także synchronizowania współbieżnych procesów.

  • Liczenie semaforów: Wartość semafora zliczającego w dowolnym momencie wskazuje maksymalną liczbę procesów, które mogą wejść do sekcji krytycznej dokładnie w tym samym czasie.



Działanie semafora

  • Jeśli liczba semaforów> 0, wątek uzyskuje zezwolenie, zmniejszając liczbę semaforów.

  • W przeciwnym razie jest zablokowany do czasu uzyskania pozwolenia.

  • Gdy wątek nie potrzebuje już dostępu do udostępnionego zasobu, zwalnia zezwolenie, zwiększając liczbę semaforów.



  • Jeśli inny wątek czeka na zezwolenie, wówczas ten wątek uzyska zezwolenie w tym czasie.

Implementacja semafora

import java.util.concurrent. * // Przyjmie Resource jako klasę współdzieloną 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 () {// Uruchom przez X if (this.getName (). equals ('X')) {System.out.println ('Starting' + threadName) try {// Otrzyma pozwolenie na dostęp do współdzielonego zasobu System.out.println (threadName + 'czeka na pozwolenie.') // uzyskanie blokady sem.acquire () System.out.println (threadName + 'dostaje zezwolenie . ') // Teraz dostęp do udostępnionego zasobu i reszty będzie czekał 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) } } 

Wynik-
Rozpoczynając X
Począwszy od Y
X czeka na pozwolenie
Czekam na pozwolenie
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X wydaje zezwolenie
Y dostaje pozwolenie
T: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
I wydaje pozwolenie
liczba: 0

W ten sposób kończymy blog poświęcony „Semaforom w Javie”. Jeśli chcesz dowiedzieć się więcej o Javie, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistą Java. Kurs ma na celu zapewnienie przewagi w programowaniu w języku Java i przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.

python __init__

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na blogu „Co to jest semafor w Javie”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.