Lock接口,在java.util.concurrent的lock包下。
锁是用来控制多个线程访问共享资源的方式。
AQS(AbstractQueuedSynchronizer)简称同步器,
同步器是构建锁和其他同步组件的基础框架,主要依赖
一个atomic int 成员变量来表示同步状态,以及通过一个FIFO队列构成等待队列。
它的子类必须重写AQS的几个protected修饰的用来改变同步状态的方法,其它方法主要是实现了排队和阻塞机制。
状态的更新使用getState,setState以及compareAndSetState三个方法。
同步器是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。
锁是面向使用者,它定义了使用者与锁交互的接口,隐藏了实现细节;同步器是面向锁的实现者,它简化了锁的实现方式,屏蔽了同步状态的管理,线程的排队,等待和唤醒等底层操作。锁和同步器很好地隔离了使用者和实现者所需关注的领域。
AQS使用模板设计模式
可重写的方法:
protected boolean tryAcquire(int arg) 独占式获取同步状态,实现该方法需要查询当前状态并判断同步是否符合预期,然后再进行CAS设置同步状态。
jprotected boolean tryRelease(int arg) 独占试释放同步状态,等待获取同步状态的线程将有机会获取同步状态
protected int tryAcquireShared(int arg) 共享试获取同步状态,返回大于等于0的值,表示获取成功,反之获取失败。
protected boolean tryReleaseShared(int arg) 共享试释放同步状态
protected boolean isHeldExclusively() 当前同步器是否在独占模式下被线程占用,一般该方法表示是否被当前线程所独占。