重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态处理逻辑的疑问

wjqwei 2016-05-11 03:10:43
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态的处理逻辑是通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,表示获取同步状态成功。
那么为什么不能在判断当前线程是获取锁的线程再次请求直接返回true,而要将同步状态值加1,同步状态值加1的实际意义是什么?
...全文
579 3 打赏 收藏 转发到动态 举报
写回复
用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的时候,可能会造成一些问题,一些个人的简单理解,不一定对,一起讨论

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧