非阻塞算法: 利用底层的源自机器指令(好比CAS)代替锁来实现数据在并发访问中的一致性。应用于:操做系统和JVM中实现线程/进程调度机制,垃圾回收机制以及锁和其余并发数据结构。 算法
与基于锁的方案相比, 非阻塞算法实现复杂,可是可伸缩性和活跃性拥有优点,多线程竞争相同数据的状况下不用阻塞,能够在更细的类度上进行协调, 减小调度开销, 在非阻塞算法中不存在死锁和活跃性问题。 数据结构
原子变量提供了与volatile相同的内存语义, 同时支持原子操做, 比基于锁的操做更有可伸缩性。 多线程
锁的劣势:竞争锁的线程会挂起和恢复线程, 这样调度和开销会比较大。 并发
Volatile是更轻级别的同步机制,在使用时不会发生上下文切换或者线程调度,可是volatile不能保证构建原子的复合操做,当一个变量依赖于其余变量或者当变量的新值依赖于旧值时, 就不能使用volatile变量。因此不能用来实现计数器和互斥体(mutex). 编码
所得缺点还有线程在等待锁时不能作其余的事情, 这样多线程等待锁时,等待线程被阻塞。若是持有锁的线程优先级别低而请求所得线程优先级别高就会发生优先级别翻转(Priovrity Inversion). 操作系统
JVM对CAS的支持 线程
JAVA5.0以前若是不明确编码,是不可以调用CAS的, 在Java5.0后,引入了底层的支持, 在int, long和对象的引用等类型上都公开了CAS操做,而且便觉得底层的硬件提供的最有效的方法, 原子变量类正是利用了这种功能来实现的。 对象
原子变量类是一种泛化的volatile变量,可以支持原子的和有条件的读-改-写操做。原子变量类有:AtomicInteger, AtomicLong, AtomicBoolean以及AtomicReference. 进程