Module  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 ,允许在公平的锁定驳船,那么将定时和不定时的形式结合在一起:

           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监视器方法( waitnotify ,并notifyAll与使用时)内置监视器锁定。

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

        public String toString​()
        返回一个标识此锁的字符串以及其锁定状态。 括号中的状态包括字符串"Unlocked"或字符串"Locked by"后跟所属线程的name
        重写:
        toStringObject
        结果
        标识此锁的字符串以及其锁定状态
      • isHeldByCurrentThread

        public boolean isHeldByCurrentThread​()
        查询这个写锁是否由当前线程持有。 相同于ReentrantReadWriteLock.isWriteLockedByCurrentThread()
        结果
        true如果当前线程持有该锁,否则为 false
        从以下版本开始:
        1.6
      • getHoldCount

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