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.