前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程---ReentrantLock

Java多线程---ReentrantLock

作者头像
None_Ling
发布2018-10-24 14:59:46
4520
发布2018-10-24 14:59:46
举报
文章被收录于专栏:Android相关Android相关

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的时候会被设置,确保一个可传播的节点,解释其他的操作也在阻扰它。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ReentrantLock介绍
  • ReentrantLock使用
  • ReentrantLock中的Node中waitStatus
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档