5

El siguiente es el típico patrón de lector y escritor (una gran cantidad de lecturas y escrituras pocos)Java: ReentrantReadWriteLock con prioridad

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(); 
     } 
    } 

Me pregunto que es posible tener prioridad al escritor y el lector? Por ejemplo, normalmente el escritor podría esperar mucho tiempo (quizás para siempre) si hay bloqueos de lectura retenidos constantemente por otro hilo, por lo que es posible tener un escritor con mayor prioridad, de modo que cada vez que un escritor llegue pueda considerarse como que está siendo alta prioridad (salto de línea) algo así.

Respuesta

4

De acuerdo con javadoc, la implementación jdk hace no tiene prioridad de lector/escritor. sin embargo, si utiliza la implementación "justa", el bloqueo es otorgado en orden de fifo (todavía no hay preferencia de lector/escritor), por lo que al menos los lectores futuros no bloquearán los escritores en espera.

+0

¿Cree que es necesaria otra recolección concurrente adicional en este punto? como BlockingQueue? o Concurrent PriortyQueue algo así? – peter

+0

@ user1389813 - ¿la orden fifo no es una garantía lo suficientemente fuerte para sus necesidades? teniendo en cuenta que los lectores (en su ejemplo) solo leen un valor simple, no puedo imaginar que un escritor estará bloqueado durante tanto tiempo esperando a los lectores existentes (que pueden proceder al mismo tiempo). – jtahlborn

+0

¿cuál es su sugerencia? – peter

0

Los bloqueos de escritura ya tienen prioridad sobre los bloqueos de lector.

Si un hilo desea leer el recurso, está bien mientras no haya ningún hilo escribiendo en él, y ningún hilo ha solicitado acceso de escritura al recurso. Al priorizar por encima las solicitudes de acceso de escritura, suponemos que las solicitudes de escritura son más importantes que las solicitudes de lectura.

por favor, consulte this excellent post para más detalles.

Editar: es importante tener en cuenta que esto es válido para el fair mode only. gracias @jtahlborn!

+1

de acuerdo con [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html): "Esta clase no impone un lector o orden de preferencia de escritor para el acceso de bloqueo ". el artículo que vinculó es una implementación separada. – jtahlborn

+0

@jtahlborn lea en: "Un hilo que intente adquirir un bloqueo de lectura regular (sin reentrada) se bloqueará si se retiene el bloqueo de escritura, o si hay un hilo de escritor en espera." – Vitaliy

+1

sí, para la versión de _fair_, y eso no es _prioridad del escritor. por favor mira mi respuesta. – jtahlborn

Cuestiones relacionadas