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/04/19 16:07] – [Υλοποίηση Fair Lock] gthanos | java:starvation_fairness [2017/03/21 13:09] (current) – [Παρατεταμένη στέρηση πόρων] gthanos | ||
---|---|---|---|
Line 5: | Line 5: | ||
Η παρατεταμένη στέρηση πόρων μπορεί να οφείλεται στους εξής λόγους: | Η παρατεταμένη στέρηση πόρων μπορεί να οφείλεται στους εξής λόγους: | ||
* Νήματα με αυξημένη προτεραιότητα καταναλώνουν όλο τον επεξεργαστικό χρόνο από νήματα με περιορισμένη προτεραιότητα. | * Νήματα με αυξημένη προτεραιότητα καταναλώνουν όλο τον επεξεργαστικό χρόνο από νήματα με περιορισμένη προτεραιότητα. | ||
- | * Νήματα μπλοκάρονται διαρκώς από τον να μπουν μέσα σε ένα συγχρονισμένο block και να λάβουν το σχετικό lock καθώς | + | * Νήματα μπλοκάρονται διαρκώς από τον να μπουν μέσα σε ένα συγχρονισμένο block και να λάβουν το σχετικό lock καθώς άλλα νήματα καταλαμβάνουν διαρκώς τα monitor που αντιστοιχούν στους πόρους αυτούς. |
==== Υλοποιώντας την ισότιμη χρήση των πόρων ==== | ==== Υλοποιώντας την ισότιμη χρήση των πόρων ==== | ||
Line 71: | Line 71: | ||
Η παραπάνω υλοποίηση της κλειδαριάς δεν μας εξασφαλίζει οποιαδήποτε ισοτιμία ως προς τη κατανομή του χρόνου εκτέλεσης των νημάτων. Η notify() είμαστε σίγουροι ότι θα ξυπνήσει ένα νήμα, αλλά δεν ξέρουμε ποιο νήμα θα είναι αυτό κάθε φορά. Παρακάτω δίνεται η υλοποίηση μίας κλειδαριάς που επιτρέπει την ισότιμη επιλογή νημάτων προς εκτέλεση μέσω ενός μηχανισμού [[wp> | Η παραπάνω υλοποίηση της κλειδαριάς δεν μας εξασφαλίζει οποιαδήποτε ισοτιμία ως προς τη κατανομή του χρόνου εκτέλεσης των νημάτων. Η notify() είμαστε σίγουροι ότι θα ξυπνήσει ένα νήμα, αλλά δεν ξέρουμε ποιο νήμα θα είναι αυτό κάθε φορά. Παρακάτω δίνεται η υλοποίηση μίας κλειδαριάς που επιτρέπει την ισότιμη επιλογή νημάτων προς εκτέλεση μέσω ενός μηχανισμού [[wp> | ||
+ | |||
+ | <WRAP important 80% round center> | ||
+ | Όταν περιφρουρούμε ένα κρίσιμο τμήμα κώδικα με μία κλειδαριά (όπως η παραπάνω) το οποίο μπορεί να δώσει ένα ή περισσότερα Exceptions είναι σημαντικό να τοποθετούμε τη μέθοδο unlock() μέσα σε ένα finally block. Με αυτό τον τρόπο είμαστε βέβαιοι ότι ακόμη και εάν συμβεί κάποιο Exception, η κλειδαριά θα ξεκλειδώσει, | ||
+ | <code java> | ||
+ | lock.lock(); | ||
+ | try{ | ||
+ | //do critical section code, which may throw exception | ||
+ | } finally { | ||
+ | lock.unlock(); | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
==== Υλοποίηση Fair Lock ==== | ==== Υλοποίηση Fair Lock ==== | ||
Line 112: | Line 124: | ||
boolean | boolean | ||
synchronized(this){ | synchronized(this){ | ||
- | waitingThreads.add(queueObject); | + | waitingThreads.add(queueObject); |
} | } | ||
java/starvation_fairness.1429459679.txt.gz · Last modified: 2015/04/19 15:08 (external edit)