Module java.base

Class ReentrantReadWriteLock.ReadLock

java.lang.Object
java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
所有已实现的接口:
Serializable, Lock
封装类:
ReentrantReadWriteLock

public static class ReentrantReadWriteLock.ReadLock extends Object implements Lock, Serializable
方法ReentrantReadWriteLock.readLock()返回的锁。
参见:
  • Constructor Details

  • Method Details

    • lock

      public void lock()
      获取读锁。

      如果写锁未被其他线程持有,则立即获取读锁。

      如果写锁被其他线程持有,则当前线程将因线程调度目的而被禁用,并处于休眠状态,直到获取读锁为止。

      指定者:
      lock 在接口 Lock
    • lockInterruptibly

      public void lockInterruptibly() throws InterruptedException
      获取读锁,除非当前线程被中断

      如果写锁未被其他线程持有,则立即获取读锁。

      如果写锁被其他线程持有,则当前线程将因线程调度目的而被禁用,并处于休眠状态,直到以下两种情况发生之一:

      • 当前线程获取读锁;或
      • 其他线程中断当前线程。

      如果当前线程:

      • 在进入此方法时设置了中断状态;或
      • 在获取读锁时被中断
      则抛出InterruptedException,并清除当前线程的中断状态。

      在此实现中,由于此方法是显式中断点,优先响应中断而不是正常或可重入地获取锁。

      指定者:
      lockInterruptibly 在接口 Lock
      抛出:
      InterruptedException - 如果当前线程被中断
    • tryLock

      public boolean tryLock()
      仅在调用时写锁未被其他线程持有时获取读锁。

      如果写锁未被其他线程持有,则立即获取读锁并返回值true。即使此锁已设置为使用公平排序策略,调用tryLock()将立即获取读锁(如果可用),无论其他线程当前是否正在等待读锁。这种“插队”行为在某些情况下可能很有用,尽管它破坏了公平性。如果要遵守此锁的公平设置,则使用tryLock(0, TimeUnit.SECONDS),几乎等效(它还检测中断)。

      如果写锁被其他线程持有,则此方法将立即返回值false

      指定者:
      tryLock 在接口 Lock
      返回:
      true 如果获取了读锁
    • tryLock

      public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
      在给定等待时间内,如果写锁未被其他线程持有且当前线程未被中断,则获取读锁。

      如果写锁未被其他线程持有,则立即获取读锁并返回值true。如果此锁已设置为使用公平排序策略,则不会获取可用锁,如果其他线程正在等待锁。这与tryLock()方法相反。如果要在公平锁上允许插队的定时tryLock,则将定时和非定时形式结合使用:

       
       if (lock.tryLock() ||
           lock.tryLock(timeout, unit)) {
         ...
       }

      如果写锁被其他线程持有,则当前线程将因线程调度目的而被禁用,并处于休眠状态,直到以下三种情况之一发生:

      • 当前线程获取读锁;或
      • 其他线程中断当前线程;或
      • 指定的等待时间过去。

      如果获取了读锁,则返回值true

      如果当前线程:

      • 在进入此方法时设置了中断状态;或
      • 在获取读锁时被中断
      则抛出InterruptedException,并清除当前线程的中断状态。

      如果指定的等待时间过去,则返回值false。如果时间小于或等于零,则该方法将根本不等待。

      在此实现中,由于此方法是显式中断点,优先响应中断而不是正常或可重入地获取锁,并优先报告等待时间的过去。

      指定者:
      tryLock 在接口 Lock
      参数:
      timeout - 等待读锁的时间
      unit - 超时参数的时间单位
      返回:
      true 如果获取了读锁
      抛出:
      InterruptedException - 如果当前线程被中断
      NullPointerException - 如果时间单位为null
    • unlock

      public void unlock()
      尝试释放此锁。

      如果读者数量现在为零,则该锁将可用于写锁尝试。如果当前线程未持有此锁,则抛出IllegalMonitorStateException

      指定者:
      unlock 在接口 Lock
      抛出:
      IllegalMonitorStateException - 如果当前线程未持有此锁
    • newCondition

      public Condition newCondition()
      抛出UnsupportedOperationException,因为ReadLocks不支持条件。
      指定者:
      newCondition 在接口 Lock
      返回:
      为此Lock实例创建一个新的Condition实例
      抛出:
      UnsupportedOperationException - 总是
    • toString

      public String toString()
      返回标识此锁及其锁状态的字符串。状态在括号中包括字符串"Read locks ="后跟持有的读锁数量。
      覆盖:
      toString 在类 Object
      返回:
      返回标识此锁及其锁状态的字符串