AQS基本原理
什么是AQS?AQS即AbstractQueuedSynchronizer,是一个用于构建锁和同步器的框架。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。AQS支持独占锁(exclusive)和共享锁(share)两种模式。独占锁:只能被一个线程获取到(Reentrantlock)共享锁:可以被多个线程同时获取(CountDownLatch,ReadWriteLock).无论是独占锁还是共享锁,本质上都是对AQS内部的一个变量state的获取。state是一个原子的int变量,用来表示锁状态、资源数等。AQS内部的数据结构与原理AQS内部实现了两个队列,一个同步队列,一个条件队列。同步队列的作用是:当线程获取资源失败之后,就进入同步队列的尾部保持自旋等待,不断判断自己是否是链表的头节点,如果是头节点,就不断参试获取资源,获取成功后则退出同步队列。条件队列是为Lock实现的一个基础同步器,并且一个线程可能会有多个条件队列,只有在使用了Condition才会存在条件队列。同步队列和条件队列都是由一个个Node组成的。AQS内部有一个静态内部类Node。static final class Node { static final Node EXCLUSIVE = null; //当前节点由于超时或中断被取消 static final int CANCELLED = 1; //表示当前节点的前节点被阻塞 static final int SIGNAL = -1; //当前节点在等待condition static final int CONDITION = -2; //状态需要向后传播 static final int PROPAGATE = -3; volatile int waitStatus; volatile Node prev; volatile Node next; volatile Thread thread; Node nextWaiter; final boolean isShared() { return nex

相关新闻

最新新闻

日新闻

周新闻

月新闻