24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜

难度

初级

学习时间

30分钟

合适人群

零根底

开发言语

Java

开发环境

  • JDK v11
  • IntelliJIDEA v2018.3

友谊提示

  • 本教育归于系列教育,内容具有连贯性,本章运用到的内容之前教育中都有具体解说谢易光。
  • 本章内容针对零根底或基凯蒂芬础较差的同学比较友爱,或许关于有根底的同学来说很简单,期望咱们能够依据自己明星相片的实际状况挑选继续看完或等候看下一篇文章。谢谢咱们的体谅!

1.温故知新

前面在《“全栈2019”Java闺门心计多线程第四十章:ReadWriteLock读写锁》一章中介绍了读写锁ReadWriteLock

在《“全栈2019”Java多线程第四十一章:读锁与24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜写锁之间彼此嵌套比方》一章中介绍了读锁与写锁之间彼此嵌套状况

在《“全栈2019”Java多线程第四十二章:获取线程与读写锁的坚持数》一章中介绍了可重入读写锁ReentrantReadWriteLock的获取线程与读写锁坚持数系列办法

在《“全栈2019”Java多线程第四十三章:查询是否有线程在等候读写锁》一章中介绍了可重入读写锁ReentrantReadWriteLock的查询是否有线程正在等候获取读写锁hasQueuedThreads()办法、获取有多少个正在等候获取读写锁的线程getQueueLength()办法和查询指定线程是否正在等候获取读写锁的hasQueuedThread(Thread thread)办法。

在《“全栈2019”Java多线程第四十四章:读锁不支撑Condition》一章中介绍了可重入读写锁ReentrantReadWriteLock与Condition的联系,在读写锁中,写锁是支撑Condition的,读锁是不支撑Condition的,原因在于写锁在某一时间最多只能被一个线程具有,而读锁在某一时间最多能够被多个线程具有,关于读锁而言,其他线程没有必要等候获取读锁掼蛋团团转,碧海雅韵等候唤醒是毫无意义的。

在《“全栈2019”Java多线程第四十五章:查询Condition上的等候线程》一章中介绍了怎么查询Condition上是否有线程正在等候和有多少线程正在等候。用锁的hasWaiters​(Condition condition)办法查询Condition上是否有线程正在等候,再用getWaitQueueLength​(Condition condition)办法获取Condition上等候的线程的个数。

现在介绍怎么判别恣意线程是否已持有写锁。

2.判别恣意线程是否持有写锁isWriteLocked()办法

咱们能够运用isWriteLocked()办法来判别恣意线程是否持有写锁。

请问这个办法有什么用呢?

isWriteLocked()办法能够让咱们随时查询写锁是否现已被其他线程持有了,依据查询成果咱们就能够做出相应的操作。比方,写锁现已被其他线程持有了,咱们现在是等仍是结束线程。

已然isWriteLocked()办法是判别当时线程是否获取到写锁,那么咱们的isWriteLocked()办法就只跟ReentrantReadWriteLock可重入读写锁有关了,跟ReentrantLock可重入锁无关。

下面咱们就来看看isW龙魂之睚眦必抱riteLocked()办法。

isWriteLocked()办法在ReentrantReadWriteLock类中的源码:

将注释翻译成中文:

中文注释全文:

判别恣意线程是否持有写锁,当恣意线程持有写锁时,办法回来true,不然回来false。

去掉注释版:

isWriteLocked()办法作用是判别梁久林恣意线程是否持有写锁,当恣意24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜线程持有写锁时,办法回来true,不然回来false。

拜访权限

public:isWriteLocked()办法是揭露的。

boolean:isWriteLocked()办法返上一年的树ppt课件回boolean类型的值,当恣意线程持有写锁时回来true,不然回来24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜false。

isWriteLocked()办法只能被目标调用。

参数

无。

抛出的反常

无。

使用

下面咱们就来试试isWriteLocked()办法。

首要,创建出读写锁目标:

其次,创建出读锁与写锁:

然后,让主线程去获取写锁:

最终,在获取写锁表里各调用isWriteLocked()办法并输出成果:

比方书写结束。

运转程序,履行成果:

从运转成果来看,契合预期。主线程在没有获取到写锁之前isWriteLocked()办法回来false,在获取到写锁之后isWri国产最新teLocked()办法回来true。

3.恣意线程与当时线程

上一末节说过,isWriteLocked()办法回来的是当叶梦熊朝帝恣意线程持有写锁时回来true,不然回来false。

恣意线程与当时线程在比方中指的是?

仍是把比方改写之后再说吧,有比照之后比较简单说清楚。

上一末节中只要主线程一个线程在竞赛写锁,咱们这时新建一个线程出来,并重写run()办法:24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜

让新建的线程去竞赛写锁:

并且在获取到写锁之后睡3秒钟:

然后,发动24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜线程:

最终,在董红蕾发动线程之后,使主线程睡1秒钟,再获取写锁:

比方改写结束。

运转程序,履行成果:

从运转成果来看,契合预期。

恣意线程指的是?

比方中,恣意线程指的是无论是主线程仍是新创建出来的thread线程,谁获永久的守灯人取了写锁,isWriteLocked()办法都会回来true。

当时线程呢?

当时线程指的是履行isWriteLocked()办法的线程。

比方,在thread线程里边履行的Thread.sleep()办法,那么当时线程指的便是thread线程;

在主线程里边履行的Thread.sleep()办法,那么当时线程指的便是主线程。

当然了,咱们ReentrantReadWriteLock类里边还有一个判别当时线程开释持有写锁的办法,叫怎没牛人娶了中岛美雪isWriteLockedByCurrentThread()。

4.isWriteLocked()办法与isWriteLockedByCurrentThread()办法比照

下面,修正上一末节比方。

在主线程获取写锁的前后各调用一次isWriteLockedByCurrentThread()办法:

并且在开释锁之后再调用一次:

比方修正结束,经过运转成果来比照isWriteLocked()办法与isWriteLockedByCurrentThread()办法的差异。

运转程序,履行成果:

静图:

从运转成果来看,契合预期。

为什么契合预期?

咱们能够很明显地从运转成果中看到,当其他线程现已持有写锁的状况下,isWriteLocked()办法回来的是true,isWriteLockedByCurrentThread()办法回来的是false。

在主线程获取到写锁时,isWriteLocked()办法和isWriteLockedByCurrentThread()园禾诗办法都回来的是true。

在没有线程获取写锁时(即一切线程都开释了写锁),isWr24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜iteLocked()办法和isWriteLockedByCurrentThread()办法都回来的是false。

这样一来,isWriteLocked()办法和isWriteLockedByCurrentThread()办法的差异清楚明了了:

isWriteLocked()办法用于判别当恣意线程持有写锁时,办法回来true,不然回来false。

isWriteLockedByCurrentThread()办法用于判别当当时线程持有写锁时,办法回来true,不然回来false。

请咱们必定必定要注意!!!

最终,期望咱们能够把这个比方照着写一遍,裸扣门然后再自己默写一遍,便利今后碰到相似的面试题能够轻松应对。

祝咱们编码愉快!

GitHub

本章程序GitHub地址:https://github.com24节气,“全栈2019”Java多线程第四十六章:判别恣意线程是否已持有写锁,熬夜/gorhaf/Java2019/tree/master/Thread/ReadWriteLock/ReentrantReadWrite神马Lock

总结

  • isWriteLocked()办法用于判别当恣意线程持有写锁时,办法回来true,不然回来false。
  • isWriteLockedByCurrentThread()办法用于判别当当时线程持有写锁时,办法回来true,不然回来false。

至此,Java中判别恣意线程是否已持有写锁相关内容解说先告一段落,更多内容请继续重视。

答疑

假如咱们有问题或想了解更多前沿技术,请在下方留言或谈论,我会为咱们回答。

上一章

“全栈2019”Java多线程第四十五章:查询Condition上的等候线程

下一章

“全栈2019”Java多线程第四十七章:判别锁是否为公正锁isFair()

学习小组

参加同步学习小组,一起沟通与前进。

  • 方法一:重视头条号Gorhaf,私信“Java学习小组”。
  • 方法二:重视大众号Gorhaf,回复仟易贷“Java学习小组”。

全栈工程师学习方案

重视咱们,参加“全栈工程师学习方案”变压器外壳。

版权声明

原创不易,未经答应不得转载!