谈谈你对AQS的理解。AQS如何实现可重 入锁?

  1. AQS是一个JAVA线程同步的框架。是JDK中很多锁工具的核心实现框架。
  2. 在AQS中,维护了一个信号量state和一个线程组成的双向链表队列。其中,这个线程队列,就是用来给线程排队的,而state就像是一个红绿灯,用来控制线程排 队或者放行的。 在不同的场景下,有不用的意义。
  3. 在可重入锁这个场景下,state就用来表示加锁的次数。0标识无锁,每加一次 锁,state就加1。释放锁state就减1。

AQS abstract queue synchronizer 抽象队列同步器
6个操作:抢锁、释放锁、入队、出队、堵塞、唤醒

线程不安全解决方案:
Synchronized 同步锁
Lock(AQS、JUC) 线程互斥 AQS底层 锁标志位+双向链表(虚拟的双向队列)

公平锁、非公平锁 非公平锁无需等待 效率更高
ReentrantLock 可重入锁 默认是非公平锁

ReentrantLock(true)和ReentrantLock(false)的区别
非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。
非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。
相对来说:非公平锁有更好的性能,但是可能会导致阻塞队列的线程长期处于饥饿状态。
ReentrantLock lock = new ReentrantLock(true);
在这里插入图片描述
默认是非公平锁
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值