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 ответа:
Согласно javadoc , реализация jdk не имеет никакого приоритета чтения/записи. однако, если вы используете" честную " реализацию, то блокировка предоставляется в порядке fifo (по-прежнему нет предпочтений читателя/писателя), поэтому, по крайней мере, будущие читатели не будут блокировать ожидающих писателей.
Блокировки записи фактически уже имеют приоритет над блокировками чтения.
Если поток хочет прочитать ресурс, это нормально до тех пор, пока в него не будут записываться потоки и ни один поток не запросит доступ на запись к ресурсу. Повышая приоритет запросов на доступ к записи, мы предполагаем, что запросы на запись более важны, чем запросы на чтение.
Пожалуйста, обратитесь к этому превосходному сообщению для получения более подробной информации.
Edit: важно отметить, что это справедливо для только честный режим . спасибо @jtahlborn!