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 revisionPrevious revision
Next revision
Previous revision
java:thread_signalling [2018/03/09 08:01] – [Ξαφνικά ξυπνήματα (Spurious wake-ups)] gthanosjava:thread_signalling [2018/03/09 12:02] (current) – old revision restored (2018/03/09 13:23) gthanos
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 199: Line 187:
 } }
 </code> </code>
 +
 +|Προηγούμενο: [[:java:synchronized_methods_blocks| Συγχρονισμένες μέθοδοι και blocks ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:deadlock | Αδιέξοδο στην χρήση των πόρων ]]|
  
java/thread_signalling.1520582482.txt.gz · Last modified: 2018/03/09 08:01 by gthanos