This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:starvation_fairness [2015/04/19 16:07] gthanos [Υλοποίηση Fair Lock] |
java:starvation_fairness [2015/04/19 16:43] gthanos [Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/μεθόδους] |
||
|---|---|---|---|
| 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 ==== | ||