Sin
文章7
标签6
分类1
通过ReentrantLock了解AQS

通过ReentrantLock了解AQS

JUC: java.util.concorrent.* Java支持高并发的实现包

AQS

AQS到底是什么?

1、一个队列

2、一个唤醒机制

3、一堆队列节点状态

4、一个state(为0表示无锁,数字是几就是几把锁,可能锁重入)

5、模板方法设计模式

1
2
3
4
5
6
7
8
9
10
11
class X{
private final ReentrantLock lock = new ReentrantLock ();
public void m(){
lock.lock();
try{
//doSomething 互斥区
}finally{
lock.unlock();
}
}
}

公平锁和非公平锁最大的区别

公平锁先看是否有人排队,没有人直接上锁

非公平锁是不管有没有人先直接抢锁,失败再去排队

经过实践非公平锁是性能更加优越的,所以默认使用非公平锁,但性能更好是有前提的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (c == 0) {
if (!hasQueuedPredecessors() && //有没有线程在排队
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}

//这是公平锁的,非公平锁就没有第一个判断是否有线程在排队
//AQS获取锁的核心方法
public final void acquire(int arg) {
if (!tryAcquire(arg) //子类看看能不能获取锁
&&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))//先去排队,看看需不需要去休息区等候
selfInterrupt();
}

源码

先从ReentrantLock开始

1
public class ReentrantLock implements Lock, java.io.Serializable {
本文作者:Sin
本文链接:http://aimersin.top/2022/04/08/tong-guo-reentrantlock-liao-jie-aqs/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×