User Tools

Site Tools


java:synchronization

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:synchronization [2017/03/19 17:28] – [Παράδειγμα ασάφειας στις τιμές μεταβλητών παράλληλα εκτελούμενων νημάτων] gthanosjava:synchronization [2018/03/08 09:26] (current) – [Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών] gthanos
Line 3: Line 3:
 Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι είναι πιθανό να παρουσιαστεί ασάφεια ως προς τις τιμές των μεταβλητών που γράφονται οι διαβάζονται από τα παράλληλα νήματα. Το πρόβλημα της ασάφειας εξηγείται παρακάτω μέσα από ένα παράδειγμα. Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι είναι πιθανό να παρουσιαστεί ασάφεια ως προς τις τιμές των μεταβλητών που γράφονται οι διαβάζονται από τα παράλληλα νήματα. Το πρόβλημα της ασάφειας εξηγείται παρακάτω μέσα από ένα παράδειγμα.
  
-===== Παράδειγμα ασάφειας στις τιμές μεταβλητών παράλληλα εκτελούμενων νημάτων =====+===== Παράδειγμα ασάφειας στις τιμές διαμοιραζόμενων μεταβλητών παράλληλα εκτελούμενων νημάτων =====
  
-Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή μίας μεταβλητής.+Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή της μεταβλητής.
  
 <code java Counter.java> <code java Counter.java>
Line 39: Line 39:
   - το νήμα B αποθηκεύει την τιμή της c   - το νήμα B αποθηκεύει την τιμή της c
  
-Μετά από το παραπάνω σενάριο η τιμή της c θα έπρεπε να παραμένει και πάλι μηδέν καθώς το ένα νήμα την αύξησε και το άλλο την μείωσε. Αντί για αυτό η τιμή της c είναι -1 καθώς η μεταβολή από το νήμα Α στην πράξη δεν έγινε. Για να ήταν μεταβληθεί σωστά η τιμή της c η παραπάνω ακολουθία θα έπρεπε να είναι η εξής+Μετά από το παραπάνω σενάριο η τιμή της c θα έπρεπε να παραμένει και πάλι μηδέν καθώς το ένα νήμα την αύξησε και το άλλο την μείωσε. Αντί για αυτό η τιμή της c είναι -1 καθώς η μεταβολή από το νήμα Α στην πράξη δεν έγινε. Για να μεταβληθεί σωστά η τιμή της c η παραπάνω ακολουθία θα έπρεπε να είναι η εξής
   - το νήμα Α λαμβάνει την τιμή της c   - το νήμα Α λαμβάνει την τιμή της c
   - το νήμα Α αυξάνει την τιμή της c κατά 1   - το νήμα Α αυξάνει την τιμή της c κατά 1
Line 47: Line 47:
   - το νήμα B αποθηκεύει την τιμή της c   - το νήμα B αποθηκεύει την τιμή της c
  
-Εκτελέστε τον παρακάτω κώδικα που υλοποιεί το παραπάνω σενάριο.+Ο παρακάτω κώδικας υλοποιεί το παραπάνω σενάριο. Δύο νήματα μεταβάλλουν την τιμή ενός μετρητή για SIZE φορές (το ένα νήμα αυξάνει την τιμή κατά ένα και το άλλο μειώνει την τιμή κατά ένα). Μεταγλωττίστε και εκτελέστε τον παρακάτω κώδικα για διάφορες τιμές του SIZE. Τι παρατηρείτε όταν η τιμή του SIZΕ αυξάνει;
  
 <code java ModifyCounter.java> <code java ModifyCounter.java>
Line 53: Line 53:
   Counter counter;   Counter counter;
   boolean increment;   boolean increment;
 +  static final int SIZE = 10000;
  
   ModifyCounter(Counter c, boolean incr, String name) {    ModifyCounter(Counter c, boolean incr, String name) { 
Line 61: Line 62:
  
   public void run() {   public void run() {
-    for(int i=0; i<10000; i++)+    for(int i=0; i<SIZE; i++)
       if(increment)       if(increment)
         counter.increment();         counter.increment();
Line 80: Line 81:
 ===== Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών ===== ===== Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών =====
  
-Προκειμένου να αντιμετωπιστεί η ασάφεια στις τιμές των μεταβλητών κάθε κρίσιμο τμήμα κώδικα (δηλαδή το τμήμα του κώδικα που περιέχει πιθανή ασάφεια) θα πρέπει να εκτελείται κάθε φορά μόνο από ένα νήμα. Προκειμένου να εκτελείται μόνο ένα νήμα σε συγκεκριμένα τμήματα κώδικα θα χρειαστείτε την εισαγωγή συγχρονισμένων blocks την οποία θα δούμε παρακάτω.+Προκειμένου να αντιμετωπιστεί η ασάφεια στις τιμές των μεταβλητών κάθε κρίσιμο τμήμα κώδικα (δηλαδή το τμήμα του κώδικα που περιέχει πιθανή ασάφεια) θα πρέπει να εκτελείται κάθε φορά μόνο από ένα νήμα. Προκειμένου να εκτελείται μόνο ένα νήμα σε συγκεκριμένα τμήματα κώδικα θα χρειαστείτε την εισαγωγή συγχρονισμένων μεθόδων ή blocks την οποία θα δούμε στη συνέχεια
 + 
 +ροηγούμενο: [[:java:concurrency_intro | Ταυτόχρονος προγραμματισμός με χρήση νημάτων  ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:thread_memory_model| Το μοντέλο μνήμης της Java ]]| 
  
  
  
java/synchronization.1489944487.txt.gz · Last modified: 2017/03/19 17:28 (external edit)