ReentrantLock基础及原理

获取锁的方式:

  1. lock():获取不到就休眠,且不响应中断;
  2. tryLock():获取不到就返回false;
  3. tryLock(timeOut):timeOut时间内获取不到就返回false;
  4. lockInterruptibly():功能和lock一样,但是可以相应中断,抛出异常;

公平锁:

公平锁的实现比非公平锁多调用了hasQueuedPredecessors方法,判断如果同步器队列中有线程等待,则直接接入队尾;

AQS

  1. 资源:state,全局共享,被设置为volatile,通过CAS来操作修改,获取锁就把state加一,为0代表没有线程持有0;
  2. 队列AQS阻塞队列,所有等待锁的线程的集合,是一个CLH队列,头结点head不指向任何线程,是一个哑节点
  3. exclusiveOwnerThread:记录了当前持有锁的线程

两个队列

  1. AQS阻塞队列:线程竞争锁失败就会加入阻塞队列
  2. Condition条件队列:线程调用await方法就会释放锁,加入条件变量对应的条件队列,如果其他线程调用signal或signalAll,就会有一个或全部节点从条件队列中移出,加入阻塞队列

一个锁只有一个阻塞队列

一个锁多个条件变量

一个条件变量一个条件队列

https://img2018.cnblogs.com/i-beta/1368608/202002/1368608-20200202210854168-669790023.png

AQS获取锁

  1. 去尝试获取锁;
  2. 获取失败,则生成节点,加入队列尾部;
    1. 通过CAS设置,在并发的情况下,去循环处理尾分叉;
  3. 判断前置是否为head节点,是的话就再去获取一次锁;
  4. 获取成功就将state加一,并将exclusiveOwnerThread置为当前线程;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值