Module java.base

Class ReentrantReadWriteLock.WriteLock

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

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

  • Method Details

    • lock

      public void lock()
      获取写锁。

      如果读锁和写锁均未被其他线程持有,则立即获取写锁,并将写锁持有计数设置为一。

      如果当前线程已经持有写锁,则将持有计数递增一,并立即返回。

      如果锁被其他线程持有,则当前线程将被禁用以进行线程调度,并处于休眠状态,直到获取写锁为止,此时写锁持有计数设置为一。

      指定者:
      lock 在接口 Lock
    • lockInterruptibly

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

      如果读锁和写锁均未被其他线程持有,则立即获取写锁,并将写锁持有计数设置为一。

      如果当前线程已经持有此锁,则将持有计数递增一,并立即返回。

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

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

      如果当前线程获取写锁,则写锁持有计数设置为一。

      如果当前线程:

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

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

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

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

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

      如果当前线程已经持有此锁,则将持有计数递增一,并返回true

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

      指定者:
      tryLock 在接口 Lock
      返回:
      true - 如果锁空闲并被当前线程获取,或写锁已被当前线程持有;false - 否则。
    • tryLock

      public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
      在给定等待时间内,仅在当前线程未被中断的情况下,获取写锁。

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

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

      如果当前线程已经持有此锁,则将持有计数递增一,并返回true

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

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

      如果当前线程获取写锁,则返回true,并将写锁持有计数设置为一。

      如果当前线程:

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

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

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

      指定者:
      tryLock 在接口 Lock
      参数:
      timeout - 等待写锁的时间
      unit - 超时参数的时间单位
      返回:
      true - 如果锁空闲并被当前线程获取,或写锁已被当前线程持有;false - 如果等待时间过去而无法获取锁。
      抛出:
      InterruptedException - 如果当前线程被中断
      NullPointerException - 如果时间单位为null
    • unlock

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

      如果当前线程持有此锁,则持有计数将递减。如果持有计数现在为零,则释放锁。如果当前线程未持有此锁,则抛出IllegalMonitorStateException

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

      public Condition newCondition()
      返回一个Condition实例,用于与此Lock实例一起使用。

      返回的Condition实例支持与内置监视器锁一起使用时与Object监视器方法(waitnotifynotifyAll)相同的用法。

      • 如果在调用任何Condition方法时未持有此写锁,则会抛出一个IllegalMonitorStateException。(读锁独立于写锁,因此不会被检查或受到影响。但是,在当前线程已获取读锁时调用条件等待方法几乎总是错误的,因为其他可能解除阻塞的线程将无法获取写锁。)
      • 当调用条件等待方法时,写锁将被释放,并在它们返回之前重新获取写锁,并将锁保持计数恢复到调用该方法时的状态。
      • 如果在等待时线程被中断,则等待将终止,将抛出一个InterruptedException,并清除线程的中断状态。
      • 等待线程按FIFO顺序发出信号。
      • 从等待方法返回的线程重新获取锁的顺序与最初获取锁的线程相同,在默认情况下未指定,但对于公平锁,有利于等待时间最长的线程。
      指定者:
      newCondition 在接口 Lock
      返回:
      Condition对象
    • toString

      public String toString()
      返回一个标识此锁及其锁状态的字符串。状态在括号中包括字符串"Unlocked"或字符串"Locked by",后跟拥有线程的名称
      覆盖:
      toString 在类 Object
      返回:
      一个标识此锁及其锁状态的字符串
    • isHeldByCurrentThread

      public boolean isHeldByCurrentThread()
      查询当前线程是否持有此写锁。效果与ReentrantReadWriteLock.isWriteLockedByCurrentThread()相同。
      返回:
      如果当前线程持有此锁,则返回true,否则返回false
      自:
      1.6
    • getHoldCount

      public int getHoldCount()
      查询当前线程对此写锁的持有次数。对于每个未匹配解锁操作的锁操作,线程都会持有一个锁。效果与ReentrantReadWriteLock.getWriteHoldCount()相同。
      返回:
      当前线程对此锁的持有次数,如果当前线程未持有此锁,则返回零
      自:
      1.6