通过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{ }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; } }
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 {
|