java:synchronized_methods_blocks

Differences

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

Link to this comparison view

Next revision
Previous revision
java:synchronized_methods_blocks [2015/03/24 15:11]
gthanos created
java:synchronized_methods_blocks [2016/02/26 11:15] (current)
Line 1: Line 1:
 ====== Συγχρονισμένες μέθοδοι και συγχρονισμένα blocks ====== ====== Συγχρονισμένες μέθοδοι και συγχρονισμένα blocks ======
  
-Η Java παρέχει δύο βασικούς τρόπους συγχρονισμού προκειμένου να αποφεύγονται τα προβλήματα συγχρονισμού που παρουσιάστηκαν προηγούμενα τις συγχρονισμένες μεθόδους και τα συγχρονισμένα blocks. ​+Η Java παρέχει δύο βασικούς τρόπους συγχρονισμού προκειμένου να αποφεύγονται τα προβλήματα συγχρονισμού που παρουσιάστηκαν προηγούμενα ​**α)** ​τις συγχρονισμένες μεθόδους και ​**β)** ​τα συγχρονισμένα blocks. ​
  
-Η διαδικασίες συγχρονισμού που περιγράφονται παρακάτω βασίζονται σε έναν εσωτερικό μηχανισμό που διαθέτουν όλα τα αντικείμενα στην Java, το λεγόμενο intrinsic lock ή monitor lock. (Το API της Java αναφέρεται συχνά στον μηχανισμό αυτό ως //​monitor//​). Όταν ένα νήμα θέλει να εκτελέσει τη συγχρονισμένη μέθοδο ενός αντικειμένου θα πρέπει να λάβει το //monitor lock// για το αντικείμενο αυτό. Αντίστοιχα,​ όταν το ίδιο νήμα θα βγει από την συχρονισμένη μέθοδο του αντικειμένου θα ελευθερώσει το //monitor lock// για το αντικείμενο. Όταν ένα νήμα έχει το //monitor lock// για ένα αντικείμενο,​ κανένα άλλο νήμα δεν μπορεί να λάβει ταυτόχρονα αυτό το lock. Μόνο το υφιστάμενο αντικείμενο μπορεί να αφήσει το lock εξερχόμενο από την συγχρονισμένη μέθοδο ή το συγχρονισμένο block.+Η διαδικασίες συγχρονισμού που περιγράφονται παρακάτω βασίζονται σε έναν εσωτερικό μηχανισμό που διαθέτουν όλα τα αντικείμενα στην Java, το λεγόμενο intrinsic lock ή monitor lock. (Το API της Java αναφέρεται συχνά στον μηχανισμό αυτό ως //​monitor//​). Όταν ένα νήμα θέλει να εκτελέσει τη συγχρονισμένη μέθοδο ενός αντικειμένου θα πρέπει να λάβει το //monitor lock// για το αντικείμενο αυτό. Αντίστοιχα,​ όταν το ίδιο νήμα θα βγει από την συγχρονισμένη μέθοδο του αντικειμένου θα ελευθερώσει το //monitor lock// για το αντικείμενο. Όταν ένα νήμα έχει το //monitor lock// για ένα αντικείμενο,​ κανένα άλλο νήμα δεν μπορεί να λάβει ταυτόχρονα αυτό το lock. Μόνο το υφιστάμενο αντικείμενο μπορεί να αφήσει το lock εξερχόμενο από την συγχρονισμένη μέθοδο ή το συγχρονισμένο block.
  
 ===== Συγχρονισμένες μέθοδοι ===== ===== Συγχρονισμένες μέθοδοι =====
Line 43: Line 43:
     nameList.add(name);​     nameList.add(name);​
 } }
-<​code>​+</code>
  
 Στο παρακάτω παράδειγμα έχουμε δύο συγχρονισμένα blocκ μέσα σε δύο μη συγχρονισμένες μεθόδους. Η διαφορά είναι ότι η κλάση ορίζει δύο επιπλέον αντικείμενα μόνο και μόνο για να χρησιμοποιήσει τα //monitor locks// των αντικειμένων αυτών Στο παρακάτω παράδειγμα έχουμε δύο συγχρονισμένα blocκ μέσα σε δύο μη συγχρονισμένες μεθόδους. Η διαφορά είναι ότι η κλάση ορίζει δύο επιπλέον αντικείμενα μόνο και μόνο για να χρησιμοποιήσει τα //monitor locks// των αντικειμένων αυτών
  
-<code java SycBlock.java>+<code java SyncBlock.java>
 public class SyncBlock { public class SyncBlock {
     private long c1 = 0;     private long c1 = 0;
Line 69: Line 69:
  
 <WRAP round center tip> <WRAP round center tip>
-Αν και ένα νήμα δεν μπορεί να λάβει το //monitor lock// ενός αντικειμένου,​ όταν αυτό έχει καταληφθεί από άλλο αντικείμενο,​ το ίδιο thread μπορεί να λάβει το //monitor lock// του ιδίου αντικειμένου όσες φορές χρειαστεί αν υπάρχουν εμφωλευμένες (nested) κλήσεις συγχρονισμένων μεθόδων ή συγχρονισμένων blocks. Σε αυτές τις περιπτώσεις το monitor lock απελευθερώνεται μόνο όταν το νήμα βγει και από την μέθοδο ή block που μπήκε ​αρχικά.+Αν και ένα νήμα δεν μπορεί να λάβει το //monitor lock// ενός αντικειμένου,​ όταν αυτό έχει καταληφθεί από άλλο αντικείμενο,​ το ίδιο thread μπορεί να λάβει το //monitor lock// του ιδίου αντικειμένου όσες φορές χρειαστεί αν υπάρχουν εμφωλευμένες (nested) κλήσεις συγχρονισμένων μεθόδων ή συγχρονισμένων blocks. Σε αυτές τις περιπτώσεις το monitor lock απελευθερώνεται μόνο όταν το νήμα βγει και από την ​τελευταία ​μέθοδο ή block στην οποία μπήκε ​πριν από ​κάθε άλλη κλήση συγχρονισμένης μεθόδου ή μπλοκ.
 </​WRAP>​ </​WRAP>​
 +
 +Δείτε το παραπάνω παράδειγμα εμφωλευμένων κλήσεων συγχρονισμένων μεθόδων ​
 +
 +<code java NestedSyncMethods.java>​
 +public class NestedSyncMethods {
 +  void synchronized outer() {
 +    inner();
 +  }
 +  ​
 +  void synchronized inner() {
 +   ...
 +  }
 +}
 +</​code>​
  
  
java/synchronized_methods_blocks.1427209900.txt.gz · Last modified: 2016/02/26 11:15 (external edit)