Java:具有优先级的ReentrantReadWriteLock

时间:2012-08-12 19:00:14

标签: java multithreading reentrantlock reentrantreadwritelock readwritelock

以下是典型的读写器模式(大量读取和少量写入)

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

我想知道是否有可能优先考虑作家和读者?例如,通常编写者可能会等待很长时间(可能永远),如果其他线程持有读取锁定,那么是否可以让编写器具有更高的优先级,因此每当编写器出现时,它都可以被认为是正如高优先级(跳过线)类似的东西。

2 个答案:

答案 0 :(得分:4)

根据javadoc,jdk实现具有任何读取器/写入器优先级。但是,如果你使用“公平”实现,那么锁 以fifo顺序被授予(仍然没有读者/作者偏好),所以至少未来的读者不会阻止等待的作者。

答案 1 :(得分:0)

写锁实际上已经优先于读卡锁。

如果一个线程想要读取资源,只要没有线程正在写入它就没关系,并且没有线程请求对资源的写访问权。通过优先考虑写访问请求,我们假设写请求比读请求更重要。

请参阅this excellent post了解详情。

编辑:请注意,这适用于fair mode only。谢谢@jtahlborn!