This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
|
java:starvation_fairness [2015/04/19 15:39] gthanos [Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/μεθόδους] |
java:starvation_fairness [2017/03/17 14:26] gthanos [Υλοποίηση Fair Lock] |
||
|---|---|---|---|
| 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); |
| } | } | ||
| Line 149: | Line 161: | ||
| </ | </ | ||
| + | Παρατηρήστε ότι μόνο ένα νήμα λαμβάνει την κλειδαριά κάθε φορά, αλλά ο χρονοπρογραμματισμός των νημάτων γίνεται με την σειρά. Όταν ένα νήμα προσπαθεί να πάρει την κλειδαριά εξυπηρετείται μόνο αν δεν υπάρχουν άλλα νήματα στην ουρά, ενώ αν υπάρχουν αυτά εξυπηρετούνται με την σειρά. Κάθε νήμα περιμένει τη σειρά του λαμβάνοντας το lock ενός διαφορετικού αντικειμένου. Με αυτόν τον τρόπο έχουμε την δυνατότητα καλώντας την notify() για το αντικείμενο για το οποίο | ||