模块  java.base

Class ReentrantReadWriteLock.WriteLock

    • 方法详细信息

      • lock

        public void lock()
        获取写锁定。

        如果读取锁定和写入锁定都不被另一个线程保持并立即返回,则将获取写入锁定,将写入锁定保持计数设置为1。

        如果当前线程已经保持写锁定,则保持计数增加1并且该方法立即返回。

        如果锁由另一个线程保持,那么当前线程将被禁用以进行线程调度,并且在获取写锁定之前处于休眠状态,此时写锁定保持计数被设置为1。

        Specified by:
        lock在界面 Lock
      • lockInterruptibly

        public void lockInterruptibly()                       throws InterruptedException
        除非当前线程是interrupted,否则获取写锁定。

        如果读取锁定和写入锁定都不被另一个线程保持并立即返回,则将获取写入锁定,将写入锁定保持计数设置为1。

        如果当前线程已经保持此锁定,则保持计数加1,并且该方法立即返回。

        如果锁由另一个线程持有,那么当前线程将被禁用以进行线程调度,并且在发生以下两种情况之一之前处于休眠状态:

        • 写锁定由当前线程获取; 要么
        • 一些其他线程interrupts当前线程。

        如果当前线程获取写锁定,则锁定保持计数设置为1。

        如果当前线程:

        • 在进入此方法时设置其中断状态; 要么
        • 获取写锁定时为interrupted
        然后抛出InterruptedException并清除当前线程的中断状态。

        在该实现中,由于该方法是显式中断点,因此优先考虑通过正常或可重入获取锁来响应中断。

        Specified by:
        lockInterruptibly在界面 Lock
        异常
        InterruptedException - 如果当前线程被中断
      • tryLock

        public boolean tryLock()
        只有在调用时没有被另一个线程持有时才获取写锁。

        如果读取锁定和写入锁定都不被另一个线程保持,则立即获取写入锁定,并立即返回值true ,将写入锁定保持计数设置为1。 即使已将此锁定设置为使用公平排序策略,对tryLock()的调用也会立即获取锁定(如果可用),无论其他线程当前是否正在等待写入锁定。 这种“闯入”行为在某些情况下可能有用,即使它违反了公平性。 如果您想要遵守此锁定的公平性设置,请使用tryLock(0, TimeUnit.SECONDS) ,这几乎是等效的(它还会检测到中断)。

        如果当前线程已经保持此锁定,则保持计数增加1,并且该方法返回true

        如果锁由另一个线程持有,则此方法将立即返回值false

        Specified by:
        tryLock ,界面 Lock
        结果
        true如果锁是空闲的并且是由当前线程获取的,或者当前线程已经保持写锁定; 否则为false
      • tryLock

        public boolean tryLock​(long timeout,                       TimeUnit unit)                throws InterruptedException
        如果在给定的等待时间内没有被另一个线程持有并且当前线程不是interrupted ,则获取写锁定。

        如果读取锁定和写入锁定都不被另一个线程保持,则立即获取写入锁定,并立即返回值true ,将写入锁定保持计数设置为1。 如果此锁定已设置为使用公平排序策略,则在任何其他线程等待写入锁定时, 将不会获取可用锁定。 这与tryLock()方法形成对比。 如果你想要一个定时tryLock允许在公平锁定上进行tryLock锁,那么将定时和非定时表格组合在一起:

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

        如果当前线程已经保持此锁定,则保持计数增加1并且该方法返回true

        如果锁由另一个线程持有,那么当前线程将被禁用以进行线程调度,并且在发生以下三种情况之一之前处于休眠状态:

        • 写锁定由当前线程获取; 要么
        • 其他一些线程interrupts当前线程; 要么
        • 指定的等待时间过去了

        如果获取写锁定,则返回值true ,并将写锁定保持计数设置为1。

        如果当前线程:

        • 在进入此方法时设置其中断状态; 要么
        • 获取写锁定时为interrupted
        然后抛出InterruptedException并清除当前线程的中断状态。

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

        在该实现中,由于该方法是显式中断点,因此优先考虑响应正常或重入获取锁的中断,并且过度报告等待时间的流逝。

        Specified by:
        tryLock ,界面 Lock
        参数
        timeout - 等待写锁定的时间
        unit - 超时参数的时间单位
        结果
        true如果锁是空闲的并且是当前线程获取的,或者当前线程已经保持写锁定; 如果在获得锁定之前经过了等待时间, false
        异常
        InterruptedException - 如果当前线程被中断
        NullPointerException - 如果时间单位为空
      • unlock

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

        如果当前线程是该锁定的持有者,则保持计数减少。 如果保持计数现在为零,则释放锁定。 如果当前线程不是此锁的持有者,则抛出IllegalMonitorStateException

        Specified by:
        unlock在界面 Lock
        异常
        IllegalMonitorStateException - 如果当前线程未保持此锁定
      • newCondition

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

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

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

        public String toString()
        返回标识此锁的字符串及其锁定状态。 括号中的状态包括字符串"Unlocked"或字符串"Locked by"后跟拥有线程的name
        重写:
        toString在类 Object
        结果
        标识此锁的字符串及其锁定状态
      • getHoldCount

        public int getHoldCount()
        查询当前线程对此写锁定的保持数。 对于与解锁操作不匹配的每个锁定操作,线程都具有锁定保持。 ReentrantReadWriteLock.getWriteHoldCount()完全相同
        结果
        当前线程锁定此锁定的次数,如果当前线程未保持此锁定,则为零
        从以下版本开始:
        1.6