java并发神器 AQS(AbstractQueuedSynchronizer)
3 月,跳不动了?>>> AbstractQueuedSynchronizer AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包 AQS的核心思想 是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。 CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。 用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。 CAS(Compare and Swap) 科普 如字面意思,就是先比较再替换, cas方法有三个重要参数 : 待比较的值、预期值、要修改的新值, 如果预期值是待比较的值一致,那么就把 要修改的值赋值给待比较的值 伪代码如下: Object old; // 待比较的值 Object new; // 预期值 Object update;// 要修改的新值 if(old == new)