CAS(Compare And Swap),即比较并交换。是解决多线程并行状况下使用锁形成性能损耗的一种机制,CAS操做包含三个操做数——内存位置(V)、预期原值(A)和新值(B)。若是内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。不然,处理器不作任何操做。不管哪一种状况,它都会在CAS指令以前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;若是包含该值,则将B放到这个位置;不然,不要更改该位置,只告诉我这个位置如今的值便可。html
在JAVA中,sun.misc.Unsafe
类提供了硬件级别的原子操做来实现这个CAS。 java.util.concurrent
包下的大量类都使用了这个 Unsafe.java
类的CAS操做。至于 Unsafe.java
的具体实现这里就不讨论了。java
java.util.concurrent.atomic
包下的类大可能是使用CAS操做来实现的(eg. AtomicInteger.java
,AtomicBoolean
,AtomicLong
)。下面以 AtomicInteger.java
的部分实现来大体讲解下这些原子类的实现。安全
AbstractQueuedSynchronizer
)fifo队列 + 原子int(表示状态)多线程
原子int:AtomicInteger这个类的存在是为了知足在高并发的状况下,原生的整形数值自增线程不安全的问题;并发
AQS(AbstractQueuedSynchronizer
),AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。这个抽象类被设计为做为一些可用原子int值来表示状态的同步器的基类。若是你有看过相似 CountDownLatch
类的源码实现,会发现其内部有一个继承了 AbstractQueuedSynchronizer
的内部类 Sync
。可见 CountDownLatch
是基于AQS框架来实现的一个同步器.相似的同步器在JUC下还有很多。(eg. Semaphore
)框架
如上所述,AQS管理一个关于状态信息的单一整数,该整数能够表现任何状态。好比, Semaphore
用它来表现剩余的许可数,ReentrantLock
用它来表现拥有它的线程已经请求了多少次锁;FutureTask
用它来表现任务的状态(还没有开始、运行、完成和取消)。高并发
详情见:性能
https://www.cnblogs.com/waterystone/p/4920797.htmlatom
https://blog.csdn.net/holmofy/article/details/73824757spa
https://blog.csdn.net/zcw4237256/article/details/78552741