java:starvation_fairness

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:starvation_fairness [2015/04/19 15:33]
gthanos [Υλοποιώντας την ισότιμη χρήση των πόρων]
java:starvation_fairness [2016/02/26 11:15] (current)
Line 20: Line 20:
 </​code>​ </​code>​
  
-Αν περισσότερα του ενός νήματα καλούν την μέθοδο //​doSynchronized()//​ μόνο ένα νήμα θα μπορέσει να μπει στην μέθοδο,​ ενώ τα υπόλοιπα θα μπλοκάρουν μέχρι το νήμα αυτό να εξέλθει. Σε αυτή την περίπτωση η σειρά με την οποία τα νήματα θα περάσουν από τη συγχρονισμέν μέθοδο //​doSynchronized()//​ δεν μπορεί να προβλεφθεί.+Αν περισσότερα του ενός νήματα καλούν την μέθοδο //​doSynchronized()//​ μόνο ένα νήμα θα μπορέσει να μπει στην μέθοδο,​ ενώ τα υπόλοιπα θα μπλοκάρουν μέχρι το νήμα αυτό να εξέλθει. Σε αυτή την περίπτωση η σειρά με την οποία τα νήματα θα περάσουν από τη συγχρονισμένη μέθοδο //​doSynchronized()//​ δεν μπορεί να προβλεφθεί.
  
 ==== Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/​μεθόδους ==== ==== Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/​μεθόδους ====
  
-Προκειμένου να αυξήουμε την αποτελεσματικότητα θα χρησιμοποιήσουμε Locks αντί για συγχρονισμένες μεθόδους και συγχρονισμένα blocks. Τα Locks χρησιμοποιούν τα εργαλεία που είδαμε μέχρι τώρα για να δημιουργήσουν πιο σύνθετους μηχανισμούς+Προκειμένου να αυξήουμε την αποτελεσματικότητα θα χρησιμοποιήσουμε Locks αντί για συγχρονισμένες μεθόδους και συγχρονισμένα blocks. Τα Locks χρησιμοποιούν τα εργαλεία που είδαμε μέχρι τώρα για να δημιουργήσουν πιο σύνθετους μηχανισμούς.
  
 <code java Synchronizer.java>​ <code java Synchronizer.java>​
Line 70: Line 70:
 Εάν κοιτάξετε την κλάση //​Synchronizer//​ και δείτε παράλληλα την υλοποίηση της κλάσης //Lock// θα αντιληφθείτε ότι τα νήματα μπλοκάρουν καθώς επιχειρούν να προσπελάσουν την μέθοδο lock(), εάν περισσότερα τους ενός νήματα καλέσουν την lock() παράλληλα. Επίσης,​ ακόμη και εάν τα νήματα λάβουν το monitor lock του αντικειμένου που καλεί τη μέθοδο lock() και μπουν τελικά μέσα στη μέθοδο lock(), εάν η κλειδαριά έχει κλειδώσει (__isLocked=true__) τότε τα νήματα θα μπλοκάρουν μέσα στην μέθοδο //wait()//, μέχρι να κληθεί η unlock() και το lock να ελευθερωθεί. Εάν κοιτάξετε την κλάση //​Synchronizer//​ και δείτε παράλληλα την υλοποίηση της κλάσης //Lock// θα αντιληφθείτε ότι τα νήματα μπλοκάρουν καθώς επιχειρούν να προσπελάσουν την μέθοδο lock(), εάν περισσότερα τους ενός νήματα καλέσουν την lock() παράλληλα. Επίσης,​ ακόμη και εάν τα νήματα λάβουν το monitor lock του αντικειμένου που καλεί τη μέθοδο lock() και μπουν τελικά μέσα στη μέθοδο lock(), εάν η κλειδαριά έχει κλειδώσει (__isLocked=true__) τότε τα νήματα θα μπλοκάρουν μέσα στην μέθοδο //wait()//, μέχρι να κληθεί η unlock() και το lock να ελευθερωθεί.
  
-As stated earlier synchronized blocks makes no guarantees about what thread is being granted access if more than one thread is waiting to enterNor does wait() make any guarantees about what thread is awakened when notify() is calledSothe 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>​Round-robin_scheduling|Round-Robin]]. 
 + 
 +<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(); 
 +
 +</​code>​ 
 +</​WRAP>​
  
 ==== Υλοποίηση Fair Lock ==== ==== Υλοποίηση Fair Lock ====
Line 149: Line 161:
 </​code>​ </​code>​
  
 +Παρατηρήστε ότι μόνο ένα νήμα λαμβάνει την κλειδαριά κάθε φορά, αλλά ο χρονοπρογραμματισμός των νημάτων γίνεται με την σειρά. Όταν ένα νήμα προσπαθεί να πάρει την κλειδαριά εξυπηρετείται μόνο αν δεν υπάρχουν άλλα νήματα στην ουρά, ενώ αν υπάρχουν αυτά εξυπηρετούνται με την σειρά. Κάθε νήμα περιμένει τη σειρά του λαμβάνοντας το lock ενός διαφορετικού αντικειμένου. Με αυτόν τον τρόπο έχουμε την δυνατότητα καλώντας την notify() για το αντικείμενο για το οποίο ​ περιμένει το κάθε νήμα, να ξυπνήσουμε μόνο το νήμα αυτό, ενώ τα υπόλοιπα κοιμούνται.
  
java/starvation_fairness.1429457586.txt.gz · Last modified: 2016/02/26 11:15 (external edit)