谈谈你对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);
在这里插入图片描述
默认是非公平锁
谈谈你对AQS的理解。AQS如何实现可重 入锁?_第1张图片

谈谈你对AQS的理解。AQS如何实现可重 入锁?_第2张图片

你可能感兴趣的:(面试题-多线程,java,开发语言)