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
Next revision Both sides next revision
java:thread_signalling [2018/03/09 08:00]
gthanos [Συγχρονισμός με χρήση wait(), notify(), notifyAll()]
java:thread_signalling [2018/03/09 11:23]
gthanos [Ξαφνικά ξυπνήματα (Spurious wake-ups)]
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.");
       }       }
 +      // 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 80: Line 82:
  
   Object myMonitorObject = new Object();   Object myMonitorObject = new Object();
-  boolean wasSignalled = false;+  boolean wasSignalled = true;
  
   public void doWait(){   public void doWait(){
Line 106: Line 108:
   - οι //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//. Εάν δεν ισχύει αυτό τότε λαμβάνουμε ένα [[http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalMonitorStateException.html|IllegalMonitorStateException]].
- 
-<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 142: Line 130:
 public class MyWaitNotify2{ public class MyWaitNotify2{
  
-  MonitorObject myMonitorObject = new MonitorObject();+  Object myMonitorObject = new Object();
   boolean wasSignalled = false;   boolean wasSignalled = false;
  
Line 176: Line 164:
 public class SimpleLock { public class SimpleLock {
  
-  MonitorObject myMonitorObject = new MonitorObject();+  Object myMonitorObject = new Object();
   boolean wasSignalled = false;   boolean wasSignalled = false;
  
Line 199: Line 187:
 } }
 </code> </code>
 +
 +|Προηγούμενο: [[:java:synchronized_methods_blocks| Συγχρονισμένες μέθοδοι και blocks ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:deadlock | Αδιέξοδο στην χρήση των πόρων ]]|
  
java/thread_signalling.txt · Last modified: 2018/03/09 12:02 by gthanos