java:synchronization

Προβλήματα Συγχρονισμού

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

Ασάφεια ως προς τις τιμές μεταβλητών

Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή μίας μεταβλητής.

class Counter {
    private int c = 0;
 
    public void increment() {
        c++;
    }
 
    public void decrement() {
        c--;
    }
 
    public int value() {
        return c;
    }
 
}

Ας υποθέσουμε ότι έχουμε δύο νήματα Α,Β και ότι η μεταβλητή c έχει αρχικά την τιμή 0. Τα δύο νήματα επιχειρούν να μεταβάλλουν την τιμή της c ταυτόχρονα. Η μεταβολή της τιμής της μεταβλητής c γίνεται σε τρία βήματα

  • λήψη της τρέχουσας τιμής της c
  • μεταβολή της τιμής
  • αποθήκευση της c στη μνήμη

Με βάση τα παραπάνω ας υποθέσουμε την παρακάτω ακολουθία

  1. το νήμα Α λαμβάνει την τιμή της c
  2. το νήμα B λαμβάνει την τιμή της c
  3. το νήμα Α αυξάνει την τιμή της c κατά 1
  4. το νήμα Β μειώνει την τιμή της c κατά 1
  5. το νήμα Α αποθηκεύει την τιμή της c
  6. το νήμα B αποθηκεύει την τιμή της c

Μετά από το παραπάνω σενάριο η τιμή της c θα έπρεπε να παραμένει και πάλι μηδέν καθώς το ένα νήμα την αύξησε και το άλλο την μείωσε. Αντί για αυτό η τιμή της c είναι -1 καθώς η μεταβολή από το νήμα Α στην πράξη δεν έγινε. Για να ήταν μεταβληθεί σωστά η τιμή της c η παραπάνω ακολουθία θα έπρεπε να είναι η εξής

  1. το νήμα Α λαμβάνει την τιμή της c
  2. το νήμα Α αυξάνει την τιμή της c κατά 1
  3. το νήμα Α αποθηκεύει την τιμή της c
  4. το νήμα B λαμβάνει την τιμή της c
  5. το νήμα Β μειώνει την τιμή της c κατά 1
  6. το νήμα B αποθηκεύει την τιμή της c
java/synchronization.txt · Last modified: 2016/02/26 11:15 (external edit)