Приоритет проблемы читателей / писателей - PullRequest
0 голосов
/ 30 июня 2011

Я разработал решение для проблемы читателя / писателя в Java (некоторая информация по этому вопросу http://lass.cs.umass.edu/~shenoy/courses/fall08/lectures/Lec11.pdf).

Однако я не уверен, как изменить код так, чтобы он либо благоприятствовал авторам, либо предоставлял и читателю, и писателю то же самоеПриоритет. Какой тип этой проблемы мой код и как я его вижу?

public class ReaderWriter{


    int numberOfReaders;
    int numberOfWriters;

    public ReaderWriter(){
        this.numberOfReaders = 0;
        this.numberOfWriters = 0;
    }

    public synchronized void requestRead(){
        while(this.numberOfWriters > 0)
            wait();

        this.numberOfReaders++;
    }

    public synchronized void releaseRead(){
        this.numberOfReaders--;
        notifyAll();
    }

    public synchronized void requestWrite(){
        while(this.numberOfReaders > 0 || this.numberOfWriters > 0)
            wait();

        this.numberOfWriters++; 
    }

    public synchronized void releaseWrite(){
        this.numberOfWriters--;
        notifyAll();
    }
}

Ответы [ 2 ]

1 голос
/ 16 октября 2012

Ваша версия одобряет читателей (и может голодать писателей). Вот модифицированная версия, которая благоприятствует писателям (и может лишить читателей голода):

    int numberOfReaders;
    int numberOfWriters;
    int numberOfRequestedWriters;  // ++

    public ReaderWriter(){
        this.numberOfReaders = 0;
        this.numberOfWriters = 0;
        this.numberOfRequestedWriters = 0; // ++
    }

    public synchronized void requestRead(){
        while(this.numberOfWriters > 0  // --
              || this.numberOfRequestedWriters > 0) // ++
            wait();

        this.numberOfReaders++;
    }

    public synchronized void releaseRead(){
        this.numberOfReaders--;
        notifyAll();
    }

    public synchronized void requestWrite(){
        this.numberOfRequestedWriters++; // ++
        while(this.numberOfReaders > 0 || this.numberOfWriters > 0)
            wait();
        this.numberOfRequestedWriters--; // ++

        this.numberOfWriters++; 
    }

    public synchronized void releaseWrite(){
        this.numberOfWriters--;
        notifyAll();
    }
}
0 голосов
/ 30 июня 2011

Чтобы контролировать, как распределяются блокировки, вам нужно поддерживать очередь ожидающих потоков.Если часть кода, которую вы защищаете, не является дорогой, простая блокировка может быть лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...