ReenTrantLock重入锁

ReenTrantLock(重入锁)

非公平性锁(默认):不是按照先后顺序,而是按照抢占式来获得锁,
公平性锁(false):按照线程请求锁的顺序来获取锁

具体的剖析:

ReenTrantLock实现Lock和序列化接口
三个内部类:ync、NonfairSync、FairSync
抽象类Sync继承了 AbstractQueuedSynchronizer(AQS)类
构造函数:

 ReentrantLock() {
      //无参构造创建一个 ReentrantLock 的实例,默认的是非公平性锁
    sync = new NonfairSync();
}
       
     ReentrantLock(boolean fair){
     //创建一个具有给定公平策略的 ReentrantLock,默认true采用非公平性锁
 sync = fair ? new FairSync() : new NonfairSync();
      }

基本操作方法:
● public void unlock() {
当前线程的锁的释放,每次释放锁对state-1,当state为0的时候才是真正的释放锁
● isHeldByCurrentThread()
查询当前线程是否获取此锁。
● final Thread getOwner()
返回目前获取此锁的线程,
● boolean hasQueuedThreads()
查询是否有线程正在等待获取锁
● boolean hasQueuedThread()
判断传进来的线程是否处于阻塞队列中
● boolean hasWaiters(Condition condition)
判断当前condition的实例是否处于wait状态
● public int getHoldCount()
当前线程获取锁的次数

AbstractQueuedSynchronizer(很重要)
基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态。同步器的开始提到了其实现依赖于一个FIFO队列,那么队列中的元素Node就是保存着线程引用和线程状态的容器,每个线程对同步器的访问,都可以看做是队列中的一个节点。
Node的主要包含以下成员变量:

Node {
   
    int waitStatus;//节点的状态
    Node prev;//前驱节点
    Node next;//后继节点
    Node nextWaiter;//存储condition队列中的后继节点
    Thread thread;//入队列时的当前线程
}

表示节点的状态。其中包含的状态有:
CANCELLED,值为1,表示当前的线程被取消;
SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;
值为0,表示当前节点在sync队列中,等待着获取锁。

AQS: AbstractQueuedSynchronizer(没有获取到锁的线程放入队列中)
没有获得锁的线程,就存放在AQS队列中
AQS类中的state:
state=0; 表示锁是空闲的状态
state>0;表示锁被占用
state<0;表示溢出
重入锁的实现: 当前线程每获取一次锁state就进行+1操作,每次释放锁对state减一,当state=0时才是真正释放锁

锁的相关方法

sync中的操作:

获取锁的方法:
abstract void lock();

 boolean nonfairTryAcquire:
        final boo
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值