Java: ReentrantReadWriteLock с приоритетом


Ниже приведен типичный шаблон чтения и записи (много читает и мало пишет)

  private ReadWriteLock lock = new ReentrantReadWriteLock();
  private int value;

  public void writeValue(int newValue){
       lock.writeLock().lock();
       try{
           this.value = newValue;
       }
       finally{
           lock.writeLock().unlock();
       }
  }

  public int readValue(){
       lock.readLock().lock();
       try{
           return value;
       }
       finally{
           lock.writeLock().unlock();
       }
  }

Мне интересно, можно ли иметь приоритет перед писателем и читателем ? Например, обычно writer может ждать очень долго (возможно, навсегда), если есть постоянные блокировки чтения, удерживаемые другим потоком, поэтому возможно иметь writer с более высоким приоритетом, поэтому всякий раз, когда писатель приходит, его можно рассматривать как высокоприоритетное (пропуск строки) что-то вроде этого.

2 5

2 ответа:

Согласно javadoc , реализация jdk не имеет никакого приоритета чтения/записи. однако, если вы используете" честную " реализацию, то блокировка предоставляется в порядке fifo (по-прежнему нет предпочтений читателя/писателя), поэтому, по крайней мере, будущие читатели не будут блокировать ожидающих писателей.

Блокировки записи фактически уже имеют приоритет над блокировками чтения.

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

Пожалуйста, обратитесь к этому превосходному сообщению для получения более подробной информации.

Edit: важно отметить, что это справедливо для только честный режим . спасибо @jtahlborn!