java:synchronized_methods_blocks
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| java:synchronized_methods_blocks [2016/05/15 18:59] – [Συγχρονισμένες μέθοδοι και συγχρονισμένα blocks] gthanos | java:synchronized_methods_blocks [2018/03/08 12:03] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| Η Java παρέχει δύο βασικούς τρόπους συγχρονισμού προκειμένου να αποφεύγονται τα προβλήματα συγχρονισμού που παρουσιάστηκαν προηγούμενα **α)** τις συγχρονισμένες μεθόδους και **β)** τα συγχρονισμένα blocks. | Η Java παρέχει δύο βασικούς τρόπους συγχρονισμού προκειμένου να αποφεύγονται τα προβλήματα συγχρονισμού που παρουσιάστηκαν προηγούμενα **α)** τις συγχρονισμένες μεθόδους και **β)** τα συγχρονισμένα blocks. | ||
| - | Η διαδικασίες συγχρονισμού που περιγράφονται παρακάτω βασίζονται σε έναν εσωτερικό μηχανισμό που διαθέτουν όλα τα αντικείμενα στην Java, το λεγόμενο intrinsic lock ή monitor lock ή monitor. Όταν ένα νήμα θέλει να εκτελέσει τη συγχρονισμένη μέθοδο ενός αντικειμένου θα πρέπει να λάβει το //monitor lock// για το αντικείμενο αυτό. Αντίστοιχα, | + | Η διαδικασίες συγχρονισμού που περιγράφονται παρακάτω βασίζονται σε έναν εσωτερικό μηχανισμό που διαθέτουν όλα τα αντικείμενα στην Java, το λεγόμενο |
| + | |||
| + | Όταν ένα νήμα θέλει να εκτελέσει τη συγχρονισμένη μέθοδο ενός αντικειμένου θα πρέπει να λάβει το //monitor lock// για το αντικείμενο αυτό. Αντίστοιχα, | ||
| ===== Συγχρονισμένες μέθοδοι ===== | ===== Συγχρονισμένες μέθοδοι ===== | ||
| - | Προκειμένου να δημιουργήσετε μία συγχρονισμένη μέθοδο σε μία κλάση αρκεί να προσθέσετε το keywords | + | Προκειμένου να δημιουργήσετε μία συγχρονισμένη μέθοδο σε μία κλάση αρκεί να προσθέσετε το keyword //synchronized// κατά την δήλωση της μεθόδου, |
| <code java SynchronizedCounter.java> | <code java SynchronizedCounter.java> | ||
| public class SynchronizedCounter { | public class SynchronizedCounter { | ||
| - | | + | |
| - | | + | |
| - | c++; | + | c++; |
| - | } | + | } |
| - | | + | |
| - | c--; | + | c--; |
| - | } | + | } |
| - | | + | |
| - | return c; | + | return c; |
| - | } | + | } |
| } | } | ||
| </ | </ | ||
| Αν έχουμε ένα αντικείμενο //counter// της παραπάνω κλάσης τότε ισχύουν τα παρακάτω | Αν έχουμε ένα αντικείμενο //counter// της παραπάνω κλάσης τότε ισχύουν τα παρακάτω | ||
| - | * Δεν είναι δυνατόν | + | * Δεν είναι δυνατόν |
| - | * Όταν ένα νήμα ' | + | |
| ===== Συγχρονισμένα Βlocks ===== | ===== Συγχρονισμένα Βlocks ===== | ||
| - | Σε αναλογία με τις συγχρονισμένες μεθόδους ορίζονται και τα συγχρονισμένα blocks με την διαφορά ότι τα συχρονισμένα blocks οφείλουν να ορίσουν το αντικείμενο του οποίου λαμβάνουν το //monitor lock//, όπως παρακάτω | + | Σε αναλογία με τις συγχρονισμένες μεθόδους ορίζονται και τα συγχρονισμένα blocks με την διαφορά ότι τα συγχρονισμένα blocks οφείλουν να ορίσουν το αντικείμενο του οποίου λαμβάνουν το //monitor lock//, όπως παρακάτω |
| <code java> | <code java> | ||
| - | public void addName(String name) { | + | public class SynchronizedCounter { |
| - | | + | private int c = 0; |
| - | lastName = name; | + | |
| - | nameCount++; | + | |
| - | } | + | |
| - | | + | |
| } | } | ||
| </ | </ | ||
| Line 56: | Line 56: | ||
| public void inc1() { | public void inc1() { | ||
| synchronized(lock1) { | synchronized(lock1) { | ||
| - | | + | |
| + | | ||
| + | ; | ||
| + | | ||
| + | } | ||
| } | } | ||
| } | } | ||
| Line 62: | Line 66: | ||
| public void inc2() { | public void inc2() { | ||
| synchronized(lock2) { | synchronized(lock2) { | ||
| - | | + | |
| + | | ||
| + | ; | ||
| + | | ||
| + | } | ||
| } | } | ||
| } | } | ||
| Line 68: | Line 76: | ||
| </ | </ | ||
| - | <WRAP round center | + | < |
| - | Αν και ένα νήμα δεν μπορεί να λάβει το //monitor lock// ενός αντικειμένου, όταν αυτό έχει καταληφθεί από | + | Στο παραπάνω παράδειγμα, οι μέθοδοι **inc1** και **inc2** περιέχουν δύο συγχρονισμένα blocks που |
| </ | </ | ||
| - | Δείτε το παραπάνω παράδειγμα εμφωλευμένων κλήσεων συγχρονισμένων μεθόδων | + | <code java SyncBlockThread.java> |
| + | public class SyncBlockThread extends Thread { | ||
| + | SyncBlock block; | ||
| + | boolean counter1; | ||
| + | public SyncBlockThread(SyncBlock block, boolean counter1) { | ||
| + | this.block = block; | ||
| + | this.counter1 = counter1; | ||
| + | } | ||
| + | |||
| + | public void run() { | ||
| + | if(counter1) | ||
| + | block.inc1(); | ||
| + | else | ||
| + | block.inc2(); | ||
| + | } | ||
| + | |||
| + | public static void main(String []args) { | ||
| + | SyncBlock block = new SyncBlock(); | ||
| + | new SyncBlockThread(block, | ||
| + | new SyncBlockThread(block, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP tip 80% round center> | ||
| + | Αν και ένα νήμα δεν μπορεί να λάβει | ||
| + | </ | ||
| + | |||
| + | Δείτε το παρακάτω παράδειγμα εμφωλευμένων κλήσεων συγχρονισμένων μεθόδων | ||
| <code java NestedSyncMethods.java> | <code java NestedSyncMethods.java> | ||
| Line 86: | Line 122: | ||
| </ | </ | ||
| + | <WRAP round center tip 80%> | ||
| + | Αναφέρθηκε παραπάνω ότι μόνο ένα νήμα λαμβάνει το //monitor lock// ενός αντικειμένου προκειμένου να εκτελέσει το συγχρονισμένο block ή την συγχρονισμένη μέθοδο που συνδέεται με το αντικείμενο αυτό. Τα υπόλοιπα νήματα που πιθανόν θέλουν και εκείνα να προσπελάσουν τη συγκεκριμένη μέθοδο ή block βρίσκονται σε κατάσταση // | ||
| + | </ | ||
| + | |Προηγούμενο: | ||
java/synchronized_methods_blocks.1463338754.txt.gz · Last modified: 2016/05/15 17:59 (external edit)
