Kas ir semafors Java valodā un tā lietošana?



Procesu sinhronizēšanai tiek izmantota semafora. Šajā emuārā jūs iepazīstināsiet ar dažādu veidu un semaforu ieviešanu java.

Semafors kontrolē piekļuvi koplietotam resursam, izmantojot skaitītāju. Tas ir pavedienu sinhronizācija konstrukcija, ko izmanto signālu sūtīšanai starp pavedieniem, lai izvairītos no nokavētiem signāliem vai aizsargātu kritisko sadaļu. Šajā emuārā par Java semaforiem mēs detalizēti sapratīsim šo jēdzienu.
Šajā emuārā tiks aplūkotas šādas tēmas:

Kas ir semafors Java valodā?

Semafors ir mainīgs lielums, ko izmanto procesu sinhronizēšanai un kas tiek izmantots vienlaicīgu procesu vadībai. To izmanto arī, lai kontrolētu piekļuvi kopīgam resursam, veicot vairākus vienlaikus procesus, un izvairītos no sacensību apstākļiem.





Semaforu veidi -

  • Bināra semafora: Binārā semafora vērtība ir tikai 0 un 1, un to izmanto, lai īstenotu savstarpēju izslēgšanu, kā arī sinhronizētu vienlaikus procesus.

  • Semafora skaitīšana: Skaitīšanas semaforas vērtība jebkurā brīdī norāda maksimālo procesu skaitu, kas var tajā pašā laikā iekļūt kritiskajā sadaļā.



Semafora darbība

  • Ja semaforu skaits> 0, pavediens iegūst atļauju, samazinot semaforu skaitu.

  • Cits tiek bloķēta, līdz var iegūt atļauju.

  • Kad pavedienam vairs nav nepieciešama piekļuve koplietotam resursam, tas atbrīvo atļauju, palielinot semaforu skaitu.



  • Ja atļauja gaida vēl vienu pavedienu, tad tajā laikā šī vītne iegūs atļauju.

Semafora ieviešana

importēt java.util.concurrent. * // Resurss tiks izmantots kā koplietojama klases klase Resurss {static int count = 0} klase MyDemo paplašina demonstrāciju {Semafora sem String threadName public MyDemo (Semafora sem, String threadName) {super (threadName). sem = sem this.threadName = threadName} @ Pārvarēt public void run () {// Run By X if (this.getName (). ir vienāds ('X')) {System.out.println ('Starting' + threadName) mēģiniet {// Saņemt atļauju piekļūt koplietotajam resursam System.out.println (threadName + 'gaida atļauju.') // iegūstot slēdzeni sem.acquire () System.out.println (threadName + 'saņem atļauju . ') // Tagad, piekļūstot koplietotajam resursam un atpūtai, būs jāgaida (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) } } 

Izeja-
Sākot ar X
Sākot ar Y
X gaida atļauju
Y gaida atļauju
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X atbrīvo atļauju
Y saņem atļauju
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Un izlaišanas atļauja
skaits: 0

ieviest saistīto sarakstu c

Ar to mēs esam nonākuši pie šī emuāra par tematu “Semaforas Java”. Ja vēlaties uzzināt vairāk par Java, pārbaudiet Autors: Edureka, uzticams tiešsaistes mācību uzņēmums ar vairāk nekā 250 000 apmierinātu izglītojamo tīklu visā pasaulē. Edureka Java J2EE un SOA apmācības un sertifikācijas kurss ir paredzēts studentiem un profesionāļiem, kuri vēlas būt Java izstrādātāji. Kurss ir paredzēts, lai dotu jums sākumu Java programmēšanā un apmācītu gan Java, gan uzlabotas koncepcijas, kā arī dažādas Java struktūras, piemēram, Hibernate & Spring.

Vai mums ir jautājums? Lūdzu, pieminējiet to šī emuāra “Kas ir semafors Java valodā” komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.