社区
Java SE
帖子详情
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态处理逻辑的疑问
wjqwei
2016-05-11 03:10:43
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态的处理逻辑是通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,表示获取同步状态成功。
那么为什么不能在判断当前线程是获取锁的线程再次请求直接返回true,而要将同步状态值加1,同步状态值加1的实际意义是什么?
...全文
604
3
打赏
收藏
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态处理逻辑的疑问
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态的处理逻辑是通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,表示获取同步状态成功。 那么为什么不能在判断当前线程是获取锁的线程再次请求直接返回true,而要将同步状态值加1,同步状态值加1的实际意义是什么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Matrix9002
2019-07-15
打赏
举报
回复
加1的目的当然是为了解锁的时候减一啊。这种问题也能问
springdy
2017-06-18
打赏
举报
回复
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } +1的情况是current == getExclusiveOwnerThread(),是当前线程已经获取锁的情况下做加一 应该是同一个线程多次获取锁标记状态用的
荣山斤火口口
2017-06-16
打赏
举报
回复
假如传递的acquires是1。ReentrantLock是支持可重入的,获取到锁的线程可以再次获取对象的锁,在获取的时候,状态进行增加,比如+1,就标识又获取了一次,在unLokc()的时候,会对状态值进行相减,如果状态值 == 0的时候,表示线程不在持有当前对象的任何锁,如果不为0,则表示还持有对象的锁,其他线程无法获取对象的锁。那么状态就是为了标识线程获取了对象的锁的次数。如果直接返回true的话,在unlock的时候,可能会造成一些问题,一些个人的简单理解,不一定对,一起讨论
Re
entr
ant
Lock
源码的使用问题详解.docx
什么是公平
锁
和非公平
锁
公平与非公平的一个很本质的区别就是,是否遵守FIFO(也就是先来后到)。当有多个线程来申请
锁
的时候,是否先申请的线程先
获取
锁
,后申请的线程后
获取
锁
?如果是的,则是 公平
锁
,否则是 非公平
锁
。 更准确地说,先申请
锁
的线程先获得
锁
竞争的权利 。对于公平的排他
锁
而言,先申请
锁
的线程会先
获取
锁
,但是对于公平的共享
锁
而言,先申请
锁
的线程会先拥有
获取
锁
竞争的权利,其他等待共享
锁
的线程也会被唤醒,有可能后唤醒的线程先
获取
锁
。
java并发之Reetran
Lock
java并发之Reetran
Lock
是并发包中的技术,在并发中常用到
面试必问之AQS原理详解.pdf
AQS 原理
lock
最 常 用 的 类 就 是 Re
entr
ant
Lock
, 其 底 层 实 现 使 用 的 是 AbstractQueuedSynchronizer(AQS) 简单来说 AQS 会把所有的请求线程构成一个 CLH 队列,当一个线程执行完毕 (
lock
.un
lock
())时会激活自己的后继节点,但正在执行的线程并不在队列中, 而那些等待执行的线程全部处于阻塞
状态
,经过调查线程的显式阻塞是通过调用
Lock
Support.park() 完成,而
Lock
Support.park() 则调用 sun.misc.Unsafe.park()本地
方法
,再进一步,HotSpot 在 Linux 中中通过调用 pthread_mutex_
lock
函数把线程交给系统内核进行阻塞。
Re
entr
ant
Lock
源码解析(二)
1 数据结构 Re
entr
ant
Lock
是可
重入
锁
,又分为公平
锁
和非公平
锁
。类图如下: 1.1 AQS源码解析 https://blog.csdn.net/qq_34125999/article/details/105343472 1.2 Sync /** * Re
entr
ant
Lock
基础结构 */ abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = -5179523762034025860L; /**
重入
锁
Re
entr
ant
Lock
详解
重入
锁
Re
entr
ant
Lock
,顾名思义,就是支持重进入的
锁
,。除此之外,该
锁
的还支持
获取
锁
时的公平和非公平性选择。在AQS实现中,当一个线程调用Mutex的
lock
()
方法
获取
锁
之后,如果
再次
调用
lock
()
方法
,则该线程将会被自己所阻塞,原因是Mutex在实现
tryAcqui
re(int acquires)
方法
时没有考虑占有
锁
的线程
再次
获取
锁
的场景,。简单的说,Mutex是一个不支持重进入的
锁
。......
Java SE
62,630
社区成员
307,264
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章