User Tools

Site Tools


java:synchronization

Differences

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

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
java:synchronization [2015/03/24 14:23]
gthanos created
java:synchronization [2017/03/19 18:27]
gthanos
Line 1: Line 1:
-====== Προβλήματα Συγχρονισμού ======+====== Το βασικό πρόβλημα του συγχρονισμού ======
  
-Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι συχνά παρουσιάζονται προβλήματα τα κυριότερα εκ των οποίων παρουσιάζονται παρακάτω.+Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι είναι πιθανό να παρουσιαστεί ασάφεια ως προς τις τιμές των μεταβλητών που γράφονται οι διαβάζονται από τα παράλληλα νήματα. Το πρόβλημα της ασάφειας εξηγείται παρακάτω μέσα από ένα παράδειγμα.
  
-===== Ασάφεια ως προς τις τιμές μεταβλητών =====+===== Παράδειγμα ασάφειας στις τιμές διαμοιραζόμενων μεταβλητών παράλληλα εκτελούμενων νημάτων =====
  
-Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή μίας μεταβλητής.+Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή της μεταβλητής.
  
-<code java>+<code java Counter.java>
 class Counter { class Counter {
     private int c = 0;     private int c = 0;
Line 23: Line 23:
     }     }
  
 +}
 +
 +class Counter {
 +  private int c = 0;
 +  public void increment() { c++; }
 +  public void decrement() {  c--; }
 +  public int value() {
 +    return c;
 +  }
 } }
 </code> </code>
Line 46: Line 55:
   - το νήμα Β μειώνει την τιμή της c κατά 1   - το νήμα Β μειώνει την τιμή της c κατά 1
   - το νήμα B αποθηκεύει την τιμή της c   - το νήμα B αποθηκεύει την τιμή της c
 +
 +Ο παρακάτω κώδικας υλοποιεί το παραπάνω σενάριο. Δύο νήματα μεταβάλλουν την τιμή ενός μετρητή για SIZE φορές (το ένα νήμα αυξάνει την τιμή κατά ένα και το άλλο μειώνει την τιμή κατά ένα). Μεταγλωττίστε και εκτελέστε τον παρακάτω κώδικα για διάφορες τιμές του SIZE. Τι παρατηρείτε όταν η τιμή του SIZΕ αυξάνει;
 +
 +<code java ModifyCounter.java>
 +public class ModifyCounter extends Thread {
 +  Counter counter;
 +  boolean increment;
 +  static final int SIZE = 10000;
 +
 +  ModifyCounter(Counter c, boolean incr, String name) { 
 +    super(name); 
 +    counter = c; 
 +    increment = incr; 
 +  }
 +
 +  public void run() {
 +    for(int i=0; i<SIZE; i++)
 +      if(increment)
 +        counter.increment();
 +      else
 +        counter.decrement();
 +        
 +    System.out.println(getName() + ". Counter is: "+counter.value());
 +  }
 +  
 +  public static void main(String []args) {
 +    Counter c = new Counter();
 +    new ModifyCounter(c, true, "IncreaseThread").start();
 +    new ModifyCounter(c, false, "DecreaseThread").start();
 +  }
 +}
 +</code>
 +
 +===== Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών =====
 +
 +Προκειμένου να αντιμετωπιστεί η ασάφεια στις τιμές των μεταβλητών κάθε κρίσιμο τμήμα κώδικα (δηλαδή το τμήμα του κώδικα που περιέχει πιθανή ασάφεια) θα πρέπει να εκτελείται κάθε φορά μόνο από ένα νήμα. Προκειμένου να εκτελείται μόνο ένα νήμα σε συγκεκριμένα τμήματα κώδικα θα χρειαστείτε την εισαγωγή συγχρονισμένων μεθόδων ή blocks την οποία θα δούμε στη συνέχεια.
 +
  
  
java/synchronization.txt · Last modified: 2018/03/08 09:26 by gthanos