JAVA之AQS
2021-07-11 本文已影响0人
isLJli
AQS的概述
AbstractQueuedSynchronizer
简述为AQS
,是一个抽象队列锁类,通过继承实现AQS的同步类,可以像Synchronized
一样进行锁操作。
AQS定义了两种资源共享模式:
- 独占式,每次只能有一个线程持有锁,其他未获取到锁的线程依次在队列中等待,
ReentrantLock
就是独占式AQS的实现锁类 - 共享式,允许多个线程同时拥有锁,并发访问共享资源,
CountDownLatch
就是AQS共享式的实现锁类
AQS的实现:
AQS使用一个int
型state值和CAS
来进行模拟锁状态实现,通过一个内置的Node
队列来存储没有获取锁的线程并且已经实现了队列的入队和释放通知功能。
并通过模版方法设计模式,把独占和共享锁一些通用的调用流程。
AQS类提供了state
值和CAS
的调用方法:
- getState()
- setState(int newState)
- compareAndSetState(int expect, int update)
AQS类获取和释放锁的重写方法:
-
boolean tryAcquire(int arg)
// 独占模式,尝试获取锁,成功返回true -
boolean tryRelease(int arg)
//独占模式,尝试释放锁,成功返回true -
int tryAcquireShared(int arg)
//共享模式,尝试获取锁,>0表示成功,<0表示失败。 -
boolean tryReleaseShared(int arg)
//共享模式,尝试释放锁,成功返回true。