User Tools

Site Tools


java:thread_signalling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
java:thread_signalling [2018/03/09 11:10]
gthanos [Συγχρονισμός μέσω διαμοιραζόμενων αντικειμένων και διαρκούς επανάληψης]
java:thread_signalling [2018/03/09 11:43]
gthanos [Συγχρονισμός με χρήση wait(), notify(), notifyAll()]
Line 53: Line 53:
         System.out.println(Thread.currentThread().getName()+" awaites locked for the lock.");         System.out.println(Thread.currentThread().getName()+" awaites locked for the lock.");
       }       }
-      Thread.sleep(10);+      // Uncomment the following line and see threads running concurrently. 
 +      // Thread.sleep(10);
       lock.lock();          lock.lock();   
       for(int i=0; i<10; i++) {       for(int i=0; i<10; i++) {
Line 105: Line 106:
  
 Η μέθοδος //notify()// ξυπνάει ένα νήμα που περιμένει στο συγκεκριμένο //monitor lock//. Όπως βλέπετε οι μέθοδοι //wait()// και //notify()// καλούνται μέσα σε ένα συγχρονισμένο block του οποίου το //monitor lock// αφορά το αντικείμενο από το οποίο καλούνται οι //wait()// και //notify()//. Το παραπάνω σχήμα είναι υποχρεωτικό, δηλαδή (ισχύουν και τα δύο παρακάτω): Η μέθοδος //notify()// ξυπνάει ένα νήμα που περιμένει στο συγκεκριμένο //monitor lock//. Όπως βλέπετε οι μέθοδοι //wait()// και //notify()// καλούνται μέσα σε ένα συγχρονισμένο block του οποίου το //monitor lock// αφορά το αντικείμενο από το οποίο καλούνται οι //wait()// και //notify()//. Το παραπάνω σχήμα είναι υποχρεωτικό, δηλαδή (ισχύουν και τα δύο παρακάτω):
-  οι //wait()// και //notify()// θα πρέπει να κληθούν μέσα σε ένα συγχρονισμένο block ή μία συγχρονισμένη μέθοδο.  +  οι //wait()// και //notify()// θα πρέπει να κληθούν μέσα σε ένα συγχρονισμένο block ή μία συγχρονισμένη μέθοδο.  
-  Κατά την κλήση των //wait()/notify()// μπορούμε να καλέσουμε τις wait()/notify() μόνο για το αντικείμενο του οποίου έχουμε αποκτήσει το //monitor lock//. Εάν δεν ισχύει αυτό τότε λαμβάνουμε ένα [[http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalMonitorStateException.html|IllegalMonitorStateException]]. +  Κατά την κλήση των //wait()/notify()// μπορούμε να καλέσουμε τις wait()/notify() μόνο για το αντικείμενο του οποίου έχουμε αποκτήσει το //monitor lock// 
- +  * Εάν δεν ισχύουν τα δύο παραπάνω δεν έχουμε καμία εγγύηση για το σωστό συγχρονισμό των νημάτων.
-<code java> +
-  public void doWait(){ +
-    synchronized(myMonitorObject){ +
-      if(!wasSignalled){ +
-        try{ +
-          myMonitorObject.wait(); +
-         } catch(InterruptedException e){...} +
-      } +
-      //clear signal and continue running. +
-      wasSignalled = false; +
-    } +
-  } +
-</code>+
  
 Εκτός από τη μέθοδο //notify()// που ξυπνάει ένα νήμα από όσα περιμένουν υπάρχει και η //notifyAll()// που ξυπνάει όλα τα νήματα που περιμένουν για το συγκεκριμένο //monitor lock//. Όταν περισσότερα του ενός νήματα περιμένουν, το ποιο νήμα από όλα θα ξυπνήσει η μέθοδος //notify()// δεν ελέγχεται από εσάς. Είστε όμως βέβαιοι ότι θα ξυπνήσει ένα νήμα. Εκτός από τη μέθοδο //notify()// που ξυπνάει ένα νήμα από όσα περιμένουν υπάρχει και η //notifyAll()// που ξυπνάει όλα τα νήματα που περιμένουν για το συγκεκριμένο //monitor lock//. Όταν περισσότερα του ενός νήματα περιμένουν, το ποιο νήμα από όλα θα ξυπνήσει η μέθοδος //notify()// δεν ελέγχεται από εσάς. Είστε όμως βέβαιοι ότι θα ξυπνήσει ένα νήμα.
  
 <WRAP important 80% round center> <WRAP important 80% round center>
-Ο παραπάνω κώδικας δεν μπορεί να εξασφαλίσει τον συγχρονισμό αν αντικαταστήσουμε την notify() με την notifyAll(). Γιατί;+Ο παραπάνω κώδικας δεν μπορεί να εξασφαλίσει τον συγχρονισμό αν αντικαταστήσουμε την //notify()// με την //notifyAll()//. Γιατί;
 </WRAP> </WRAP>
  
-Ας δούμε τώρα πως υλοποιείται ο παραπάνω μηχανισμός συγχρονισμού. Όταν ένα νήμα περιμένει μέσω της wait() ελευθερώνει παράλληλα το //monitor lock// που έχει λάβει για το αντικείμενο //myMonitorObject//, Η απελευθέρωση του //monitor lock// επιτρέπει σε άλλα νήματα που δεν έχουν το lock να το λάβουν μπαίνοντας σε ένα συγχρονισμένο block ή συγχρονισμένη μέθοδο. +Ας δούμε τώρα πως υλοποιείται ο παραπάνω μηχανισμός συγχρονισμού. Όταν ένα νήμα περιμένει μέσω της //wait()// ελευθερώνει παράλληλα το //monitor lock// που έχει λάβει για το αντικείμενο //myMonitorObject//, Η απελευθέρωση του //monitor lock// επιτρέπει σε άλλα νήματα που δεν έχουν το //lock// να το λάβουν μπαίνοντας σε ένα συγχρονισμένο block ή συγχρονισμένη μέθοδο. 
  
 <WRAP tip 80% round center> <WRAP tip 80% round center>
Line 200: Line 188:
 } }
 </code> </code>
 +
 +|Προηγούμενο: [[:java:synchronized_methods_blocks| Συγχρονισμένες μέθοδοι και blocks ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:deadlock | Αδιέξοδο στην χρήση των πόρων ]]|
  
java/thread_signalling.txt · Last modified: 2018/03/09 12:02 by gthanos