This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:synchronization [2017/03/19 17:22] gthanos [Παράδειγμα ασάφειας στις τιμές μεταβλητών παράλληλα εκτελούμενων νημάτων] |
java:synchronization [2017/03/19 18:27] gthanos |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι είναι πιθανό να παρουσιαστεί ασάφεια ως προς τις τιμές των μεταβλητών που γράφονται οι διαβάζονται από τα παράλληλα νήματα. Το πρόβλημα της ασάφειας εξηγείται παρακάτω μέσα από ένα παράδειγμα. | Τα νήματα κατά κανόνα επικοινωνούν μέσω μεταβλητών στις οποίες μοιράζονται την πρόσβαση. Το πρόβλημα με αυτού του είδους την επικοινωνία είναι ότι είναι πιθανό να παρουσιαστεί ασάφεια ως προς τις τιμές των μεταβλητών που γράφονται οι διαβάζονται από τα παράλληλα νήματα. Το πρόβλημα της ασάφειας εξηγείται παρακάτω μέσα από ένα παράδειγμα. | ||
| - | ===== Παράδειγμα ασάφειας στις τιμές μεταβλητών παράλληλα εκτελούμενων νημάτων ===== | + | ===== Παράδειγμα ασάφειας στις τιμές |
| - | Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή | + | Στο παρακάτω παράδειγμα κώδικα ας υποθέσουμε ότι ένα αντικείμενο της κλάσης Counter διαμοιράζεται μεταξύ δύο νημάτων. Η ασάφεια ως προς τις τιμές μίας μεταβλητής παρουσιάζεται όταν δύο νήματα προσπαθούν ταυτόχρονα να μεταβάλλουν την τιμή |
| <code java Counter.java> | <code java Counter.java> | ||
| Line 23: | Line 23: | ||
| } | } | ||
| + | } | ||
| + | |||
| + | class Counter { | ||
| + | private int c = 0; | ||
| + | public void increment() { c++; } | ||
| + | public void decrement() { c--; } | ||
| + | public int value() { | ||
| + | return c; | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
| Line 47: | Line 56: | ||
| - το νήμα B αποθηκεύει την τιμή της c | - το νήμα B αποθηκεύει την τιμή της c | ||
| - | Εκτελέστε τον | + | Ο παρακάτω κώδικας υλοποιεί το παραπάνω σενάριο. |
| <code java ModifyCounter.java> | <code java ModifyCounter.java> | ||
| - | public class ModifyCounter | + | public class ModifyCounter |
| Counter counter; | Counter counter; | ||
| boolean increment; | boolean increment; | ||
| + | static final int SIZE = 10000; | ||
| - | ModifyCounter(Counter c, boolean incr) { counter = c; increment = incr; } | + | ModifyCounter(Counter c, boolean incr, String name) { |
| + | super(name); | ||
| + | | ||
| + | | ||
| + | | ||
| 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 68: | Line 82: | ||
| public static void main(String []args) { | public static void main(String []args) { | ||
| Counter c = new Counter(); | Counter c = new Counter(); | ||
| - | | + | new ModifyCounter(c, |
| - | | + | new ModifyCounter(c, |
| } | } | ||
| } | } | ||
| Line 76: | Line 90: | ||
| ===== Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών ===== | ===== Αντιμετωπίζοντας την ασάφεια στις τιμές των μεταβλητών ===== | ||
| - | Προκειμένου να αντιμετωπιστεί η ασάφεια στις τιμές των μεταβλητών κάθε κρίσιμο τμήμα κώδικα (δηλαδή το τμήμα του κώδικα που περιέχει πιθανή ασάφεια) θα πρέπει να εκτελείται κάθε φορά μόνο από ένα νήμα. Προκειμένου να εκτελείται μόνο ένα νήμα σε συγκεκριμένα τμήματα κώδικα θα χρειαστείτε την εισαγωγή συγχρονισμένων blocks την οποία θα δούμε | + | Προκειμένου να αντιμετωπιστεί η ασάφεια στις τιμές των μεταβλητών κάθε κρίσιμο τμήμα κώδικα (δηλαδή το τμήμα του κώδικα που περιέχει πιθανή ασάφεια) θα πρέπει να εκτελείται κάθε φορά μόνο από ένα νήμα. Προκειμένου να εκτελείται μόνο ένα νήμα σε συγκεκριμένα τμήματα κώδικα θα χρειαστείτε την εισαγωγή συγχρονισμένων |