User Tools

Site Tools


java:starvation_fairness

This is an old revision of the document!


Παρατεταμένη στέρηση πόρων σε νήματα και ισότιμη χρήση των πόρων (Stavration)

Παρατεταμένη στέρηση πόρων

Η παρατεταμένη στέρηση πόρων μπορεί να οφείλεται στους εξής λόγους:

  • Νήματα με αυξημένη προτεραιότητα καταναλώνουν όλο τον επεξεργαστικό χρόνο από νήματα με περιορισμένη προτεραιότητα.
  • Νήματα μπλοκάρονται διαρκώς από τον να μπουν μέσα σε ένα συγχρονισμένο block και να λάβουν το σχετικό lock καθώς σε άλλα νήματα καταλαμβάνουν διαρκώς τα monitor που αντιστοιχούν στους πόρους αυτούς, χωρίς να καλούν συχνά τις μεθόδους notify() ή notifyAll().

Υλοποιώντας την ισότιμη χρήση των πόρων

Στη συνέχεια θα προσπαθήσουμε να δημιουργήσουμε μηχανισμούς που ενισχύουν την ισότιμη κατανομή των πόρων. Κατ'αρχήν ας δούμε τον παρακάτω κώδικα

public class Synchronizer{
 
  public synchronized void doSynchronized(){
    //do a lot of work which takes a long time
  }
 
}

Αν περισσότερα του ενός νήματακατα καλούν την μέθοδο doSynchronized() μόνο ένα νήμα θα μπορέσει να μπει στην μέθοδο, ενώ τα υπόλοιπα θα μπλοκάρουν μέχρι το νήμα αυτό να εξέλθει. Σε αυτή την περίπτωση η σειρά με την οποία τα νήματα θα περάσουν από τη συγχρονισμέν μέθοδο doSynchronized() δεν μπορεί να προβλεφθεί.

Χρησιμοποιώντας Locks αντί για συγχρονισμένα blocks/μεθόδους

Προκειμένου να αυξήουμε την αποτελεσματικότητα θα χρησιμοποιήσουμε Locks αντί για συγχρονισμένες μεθόδους και συγχρονισμένα blocks. Τα Locks χρησιμοποιούν τα εργαλεία που είδαμε μέχρι τώρα για να δημιουργήσουν πιο σύνθετους μηχανισμούς

Synchronizer.java
public class Synchronizer{
  Lock lock = new Lock();
 
  public void doSynchronized() throws InterruptedException{
    this.lock.lock();
      //critical section, do a lot of work which takes a long time
    this.lock.unlock();
  }
 
}

Παρατηρήστε ότι η μέθοδος doSynchronized() δεν ορίζεται πλέον ως συγχρονισμένη. Αντίθετα, ο κώδικας που θέλουμε να προστατεύσουμε επιτρέποντας την πρόσβαση μόνο σε ένα νήμα την φορά βρίσκεται ανάμεσα στις κλήσεις lock.lock() και lock.unlock().

Μία πρώτη υλοποίηση της κλάσης Lock δίνεται παρακάτω.

Lock.java
public class Lock{
  private boolean isLocked      = false;
  private Thread  lockingThread = null;
 
  public synchronized void lock() throws InterruptedException{
    while(isLocked){
      wait();
    }
    isLocked      = true;
    lockingThread = Thread.currentThread();
  }
 
  public synchronized void unlock(){
    if(this.lockingThread != Thread.currentThread()){
      throw new IllegalMonitorStateException(
        "Calling thread has not locked this lock");
    }
    isLocked      = false;
    lockingThread = null;
    notify();
  }
}
java/starvation_fairness.1427696648.txt.gz · Last modified: 2015/03/30 05:24 (external edit)