AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。
看个AQS(AbstractQueuedSynchronizer)原理图:
ion here" src="https://imgs.xnip.cn/cj/l/57/351ac667-f188-48ae-bd1d-7becaf2b4c09.png" style="width: 100%;" />
AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS对该同步状态进行原子操作实现对其值的修改。
java private volatile int state;//共享变量,使用volatile修饰保证线程可见性
状态信息通过protected类型的getState
,setState
,compareAndSetState
进行操作
java
//返回同步状态的当前值
protected final int getState() {
return state;
}
// 设置同步状态的值
protected final void setState(int newState) {
state = newState;
}
//原子地(CAS操作)将同步状态值设置为给定值update如果当前同步状态的值等于expect(期望值)
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
本文向大家介绍AQS 原理概览 相关面试题,主要包含被问及AQS 原理概览 时的应答技巧和注意事项,需要的朋友参考一下 AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。 CL
主要内容:一、写在前面,二、ReentrantLock和AQS的关系,三、ReentrantLock加锁和释放锁的底层原理,四、总结一、写在前面 上一篇文章聊了一下java并发中常用的原子类的原理和Java 8的优化,具体请参见文章:《为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!》。 这篇文章,我们来聊聊面试的时候比较有杀伤力的一个问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题。当时那位同学内心估计受到了一万点伤害。。。 因为首
类装载器ClassLoader 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件; [2.]链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的: [2.1]校验:检查载入Class文件数据的正确性; [2.2]准备:给类的静态变量分配存储空间; [2.3]解
主要内容:1.LimitLatch 介绍,2.LimitLatch使用场景,3.LimitLatch 源码分析1.LimitLatch 介绍 之前分析的ReentrantLock和CountDownLatch都是JDK中对AQS的利用,分别实现了独占锁和共享锁。 接着我们再来看一个LimitLatch,来学习下我们可以怎么将AQS应用到我们自己的程序中。 LimitLatch则更像是java中的Semaphore,用于控制资源的使用。用作限流器。 2.LimitLatch使用场景 Tomcat使
主要内容:1.ReentrantReadWriteLock 介绍,2.读写锁,3.读写锁源码分析1.ReentrantReadWriteLock 介绍 ReentrantReadWriteLock即可重入读写锁,其同时应用了共享锁和排斥锁,写锁使用排斥锁,读锁使用共享锁,从而实现读读共享,读写互斥,写写互斥。 当读操作远远高于写操作时,这时候使用读写锁让读——读可以并发,提高性能。 1.1 Sync 读写锁使用的是一个Sync同步器(使用一个对象),可以分别创建。有公平锁和非公平锁两种子类进
主要内容:1.CountDownLatch 介绍,2.实例代码,3.源码分析1.CountDownLatch 介绍 CountDownLatch即减少计数,是AQS共享锁的另一个经典应用。其应用主要是一个(或多个)线程等待一系列线程完成某些操作后才继续向下执行的场景。 换种程序上的描述:A线程申请资源await,进行阻塞等待,一系列线程进行某些操作(共state个),每完成一个释放一次资源coutDown。所有操作完成后,A线程资源获取成功,继续向下执行。 2.实例代码