java:starvation_fairness
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:starvation_fairness [2015/03/30 06:50] – [Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/μεθόδους] gthanos | java:starvation_fairness [2017/03/21 13:09] (current) – [Παρατεταμένη στέρηση πόρων] gthanos | ||
---|---|---|---|
Line 5: | Line 5: | ||
Η παρατεταμένη στέρηση πόρων μπορεί να οφείλεται στους εξής λόγους: | Η παρατεταμένη στέρηση πόρων μπορεί να οφείλεται στους εξής λόγους: | ||
* Νήματα με αυξημένη προτεραιότητα καταναλώνουν όλο τον επεξεργαστικό χρόνο από νήματα με περιορισμένη προτεραιότητα. | * Νήματα με αυξημένη προτεραιότητα καταναλώνουν όλο τον επεξεργαστικό χρόνο από νήματα με περιορισμένη προτεραιότητα. | ||
- | * Νήματα μπλοκάρονται διαρκώς από τον να μπουν μέσα σε ένα συγχρονισμένο block και να λάβουν το σχετικό lock καθώς | + | * Νήματα μπλοκάρονται διαρκώς από τον να μπουν μέσα σε ένα συγχρονισμένο block και να λάβουν το σχετικό lock καθώς άλλα νήματα καταλαμβάνουν διαρκώς τα monitor που αντιστοιχούν στους πόρους αυτούς. |
==== Υλοποιώντας την ισότιμη χρήση των πόρων ==== | ==== Υλοποιώντας την ισότιμη χρήση των πόρων ==== | ||
Line 20: | Line 20: | ||
</ | </ | ||
- | Αν περισσότερα του ενός νήματακατα καλούν την μέθοδο // | + | Αν περισσότερα του ενός νήματα καλούν την μέθοδο // |
==== Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/ | ==== Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/ | ||
- | Προκειμένου να αυξήουμε την αποτελεσματικότητα θα χρησιμοποιήσουμε Locks αντί για συγχρονισμένες μεθόδους και συγχρονισμένα blocks. Τα Locks χρησιμοποιούν τα εργαλεία που είδαμε μέχρι τώρα για να δημιουργήσουν πιο σύνθετους μηχανισμούς | + | Προκειμένου να αυξήουμε την αποτελεσματικότητα θα χρησιμοποιήσουμε Locks αντί για συγχρονισμένες μεθόδους και συγχρονισμένα blocks. Τα Locks χρησιμοποιούν τα εργαλεία που είδαμε μέχρι τώρα για να δημιουργήσουν πιο σύνθετους μηχανισμούς. |
<code java Synchronizer.java> | <code java Synchronizer.java> | ||
Line 70: | Line 70: | ||
Εάν κοιτάξετε την κλάση // | Εάν κοιτάξετε την κλάση // | ||
- | As stated earlier synchronized blocks makes no guarantees about what thread is being granted access if more than one thread is waiting to enter. Nor does wait() make any guarantees about what thread is awakened when notify() is called. So, the current version of the Lock class makes no different guarantees with respect to fairness than synchronized version of doSynchronized(). But we can change that. | + | Η παραπάνω υλοποίηση της κλειδαριάς δεν μας εξασφαλίζει οποιαδήποτε ισοτιμία ως προς τη κατανομή του χρόνου εκτέλεσης των νημάτων. Η notify() είμαστε σίγουροι ότι θα ξυπνήσει ένα νήμα, αλλά δεν ξέρουμε ποιο νήμα θα είναι αυτό κάθε φορά. Παρακάτω δίνεται η υλοποίηση μίας κλειδαριάς που επιτρέπει την ισότιμη επιλογή νημάτων προς εκτέλεση μέσω ενός μηχανισμού [[wp> |
+ | |||
+ | <WRAP important 80% round center> | ||
+ | Όταν περιφρουρούμε ένα κρίσιμο τμήμα κώδικα με μία κλειδαριά | ||
+ | <code java> | ||
+ | lock.lock(); | ||
+ | try{ | ||
+ | //do critical section code, which may throw exception | ||
+ | } finally { | ||
+ | lock.unlock(); | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
==== Υλοποίηση Fair Lock ==== | ==== Υλοποίηση Fair Lock ==== | ||
Line 81: | Line 93: | ||
public class QueueObject { | public class QueueObject { | ||
- | private boolean isNotified = false; | + | private boolean isNotified = true; |
public synchronized void doWait() throws InterruptedException { | public synchronized void doWait() throws InterruptedException { | ||
Line 112: | Line 124: | ||
boolean | boolean | ||
synchronized(this){ | synchronized(this){ | ||
- | waitingThreads.add(queueObject); | + | waitingThreads.add(queueObject); |
} | } | ||
Line 121: | Line 133: | ||
if(!isLockedForThisThread){ | if(!isLockedForThisThread){ | ||
isLocked = true; | isLocked = true; | ||
- | waitingThreads.remove(queueObject); | + | |
- | | + | lockingThread = Thread.currentThread(); |
- | | + | return; |
- | | + | } |
} | } | ||
try{ | try{ | ||
Line 149: | Line 161: | ||
</ | </ | ||
+ | Παρατηρήστε ότι μόνο ένα νήμα λαμβάνει την κλειδαριά κάθε φορά, αλλά ο χρονοπρογραμματισμός των νημάτων γίνεται με την σειρά. Όταν ένα νήμα προσπαθεί να πάρει την κλειδαριά εξυπηρετείται μόνο αν δεν υπάρχουν άλλα νήματα στην ουρά, ενώ αν υπάρχουν αυτά εξυπηρετούνται με την σειρά. Κάθε νήμα περιμένει τη σειρά του λαμβάνοντας το lock ενός διαφορετικού αντικειμένου. Με αυτόν τον τρόπο έχουμε την δυνατότητα καλώντας την notify() για το αντικείμενο για το οποίο | ||
java/starvation_fairness.1427698245.txt.gz · Last modified: 2015/03/30 05:50 (external edit)