Τι είναι το Semaphore στην Java και η χρήση του;

Ένα semaphore χρησιμοποιείται για το συγχρονισμό των διαδικασιών. Αυτό το ιστολόγιο θα σας καθοδηγήσει στους διάφορους τύπους και την εφαρμογή των σηματοφόρων στην Ιάβα.

Ένας Σηματοφόρος στο ελέγχει την πρόσβαση σε κοινόχρηστο πόρο μέσω μετρητή. Είναι ένα συγχρονισμός νήματος κατασκευή που χρησιμοποιείται για την αποστολή σημάτων μεταξύ νημάτων για την αποφυγή χαμένων σημάτων ή την προστασία μιας κρίσιμης ενότητας. Σε αυτό το blog στο Semaphores στην Java, θα κατανοήσουμε λεπτομερώς την ιδέα.
Τα ακόλουθα θέματα θα καλυφθούν σε αυτό το ιστολόγιο:



Τι είναι το Semaphore στην Java;

Το semaphore είναι μια μεταβλητή που χρησιμοποιείται για το συγχρονισμό των διεργασιών που χρησιμοποιείται για τη διαχείριση ταυτόχρονων διεργασιών. Χρησιμοποιείται επίσης για τον έλεγχο της πρόσβασης σε έναν κοινό πόρο με πολλαπλές ταυτόχρονες διαδικασίες και την αποφυγή μιας κατάστασης αγώνα.



Τύποι σηματοφόρων -

  • Δυαδικό σηματοφόρο: Ένα δυαδικό semaphore παίρνει μόνο 0 και 1 ως τιμές και χρησιμοποιείται για την εφαρμογή αμοιβαίου αποκλεισμού καθώς και για συγχρονισμό ταυτόχρονων διαδικασιών.

    πώς να εγκαταστήσετε το hadoop στο linux
  • Μετρώντας σηματοφόρος: Η τιμή ενός μετρήματος σηματοφόρου σε οποιοδήποτε σημείο δείχνει τον μέγιστο αριθμό διαδικασιών που μπορούν να εισέλθουν στην κρίσιμη ενότητα την ίδια στιγμή.



Εργασία του Semaphore

  • Εάν ο αριθμός των σηματοφόρων> 0, το νήμα αποκτά άδεια, μειώνοντας τον αριθμό των σηματοφόρων.

  • Αλλιώς, το αποκλείεται έως ότου μπορεί να ληφθεί άδεια.

  • Όταν το νήμα δεν χρειάζεται πλέον πρόσβαση σε κοινόχρηστο πόρο, απελευθερώνει την άδεια, αυξάνοντας τον αριθμό των σηματοφόρων.



  • Εάν ένα άλλο νήμα περιμένει μια άδεια, τότε αυτό το νήμα θα αποκτήσει μια άδεια εκείνη τη στιγμή.

Εφαρμογή του Semaphore

import java.util.concurrent. * // Θα πάρει το Resource ως κοινόχρηστη κλάση Class Resource {static int count = 0} Η κλάση MyDemo επεκτείνει το Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) αυτό. sem = sem this.threadName = threadName} @ Override public void run () {// Run By X if (this.getName (). ισούται με ('X')) {System.out.println ('Start' + threadName) δοκιμάστε {// Θα λάβετε την άδεια πρόσβασης σε κοινόχρηστους πόρους System.out.println (threadName + 'αναμονή άδειας.') // απόκτηση του κλειδώματος sem.acquire () System.out.println (threadName + 'παίρνει άδεια . ') // Τώρα, η πρόσβαση στον κοινόχρηστο πόρο και το υπόλοιπο θα περιμένουν (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) } } 

Παραγωγή-
Ξεκινώντας Χ
Ξεκινώντας Y
X περιμένει άδεια
Περιμένετε άδεια
Χ: 1
Χ: 2
Χ: 3
Χ: 4
Χ: 5
Χ: 6
Χ: 7
Ο Χ απελευθερώνει την άδεια
Παίρνει την άδεια
Υ: 6
Υ: 5
Υ: 4
Υ: 3
Υ: 2
Υ: 1
Υ: 0
Και άδεια κυκλοφορίας
μέτρηση: 0

Με αυτό, φτάνουμε στο τέλος αυτού του ιστολογίου στο 'Semaphores in Java'. Εάν θέλετε να μάθετε περισσότερα για την Java, ρίξτε μια ματιά στο από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για φοιτητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για τις βασικές όσο και για τις προηγμένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Spring.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Τι είναι το Semaphore in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.