Java多线程---ReentrantLock

ReentrantLock介绍

重入锁。同一个线程可以锁住多次,但是在使用完毕后,必须释放多次锁才能将锁完全释放,否则,还是该线程还是会处于阻塞状态。并且重入锁有两种,一种是公平锁,一种是非公平锁,公平锁会把锁按照顺序轮流交付线程执行,而非公平锁不会,非公平锁会乱序选择一个线程执行。

ReentrantLock使用

ReentrantLock.lock:加锁 ReentrantLock.tryLock:可输入时间,如果在指定时间内,获取到锁的话,那么就会返回true,否则返回false,如果没有指定时间的话,就立即去尝试获取锁 ReentrantLock.lockInterruptibly:可以被中断的锁,加锁的线程被调用interrupt方法后,可以被中断释放锁,而不会抛出异常 ReentrantLock.isHeldByCurrentThread:判断当前的Lock是否被当前线程Hold住 ReentrantLock.getHoldCount:判断当前的锁被多少个线程引用住 ReentrantLock.hasQueuedThread:判断传入的Thread是否已经存在于锁等待队列中 ReentrantLock.hasQueuedThreads:判断当前等待队列中是否有线程正在等待锁

ReentrantLock中的Node中waitStatus

Node中的waitStatus中会有五种变量:

  1. CANCELLED:值为1。表示当前节点被取消了,由于超时或者中断的原因导致的取消,那么这个节点就永远会处于CANCELLED状态,不会在变成其他的状态了。典型的,一个被Cancelled节点永远不会被阻塞。
  2. 0:除了四种状态之外的所有状态
  3. SIGNAL:值为-1。表示当前节点的后继节点已经被阻塞或者即将被阻塞了(通过LockSupport.park),所以当前节点必须unpark它的后继节点,当这个节点被释放或者取消的时候。为了避免竞争,acquire方法必须首先表明他们需要一个Singal,然后重试原子的获取操作,然后如果失败了,那么就阻塞。
  4. CONDITION:值为-2。表示当前节点正处在一个Condition队列中,处在这种状态的节点不会被用来作为一个同步队列的节点,直到被transferred。而transferred带来的作用就是将状态值设置成了0的初始化状态。
  5. PROPAGATE:值为-3。表示一个可传播的节点,它只有在doReleaseShared的时候会被设置,确保一个可传播的节点,解释其他的操作也在阻扰它。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

如何创建.htaccess 文件

关于.htaccess 文件,一般用于虚拟主机中,使用 VPS 建站的可以忽略了。对于使用虚拟主机建站的朋友来说.htaccess 文件可以用作伪静态化设置和 ...

47780
来自专栏安恒网络空间安全讲武堂

打个3dsctf,电脑机都开不了?

3DSCTF Malware 3道题 writeup tags: - Reverse - malware ---- 这个ctf有个Malware的题型,...

27590
来自专栏编程思想之路

Android四大组件完全解析(一)---Activity

本文参考\android\android\frameworks\base\core\java\android\app\Activity.java文件中的类注释,...

532100
来自专栏NetCore

Identity Service - 解析微软微服务架构eShopOnContainers(二)

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,...

28050
来自专栏Laoqi's Linux运维专列

Mysql 主从一键部署

22430
来自专栏专注研发

PageHelper分页插件及通用分页js

物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的...

54410
来自专栏WindCoder

自用插件整理之表格bootstrap-table

本插件基于bootstrap,网上各种例子也比较多,本文就不详细列api一类的了,只将自己常用的记录一下。多数代码中存在的注释,就不再重写。

1.2K10
来自专栏依乐祝

Net Core集成Exceptionless分布式日志功能以及全局异常过滤

这篇文章有一部分内容翻译自官方文档,[点我阅读][https://github.com/exceptionless/Exceptionless.Net/wiki...

11620
来自专栏逸鹏说道

直传文件到Azure Storage的Blob服务中

题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure Storage的Blob服务中。 为什么 如果...

39370
来自专栏高性能服务器开发

+从零实现一款12306刷票软件1.2

当然,这里需要说明一下的就是,由于全国的火车站点信息文件比较大,我们程序解析起来时间较长,加上火车站编码信息并不是经常变动,所以,我们我们没必要每次都下载这个s...

24220

扫码关注云+社区

领取腾讯云代金券