1.非阻塞算法被广泛用于在操作系统和JVM中实现线程/进度调度机制、垃圾回收机制以及锁和其他并发数据结构。
非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次协调,并且极大地减少调度开销,非阻塞算法不存在死锁和其他活跃性问题,
原子变量类:
java5.0后,使用原子变量类(例如AtomicInteger和AtomicReference)来构建高效的非阻塞算法
原子变量类比锁的粒度更细量级更轻,将发生竞争的范围缩小到单个变量上。
基本类型的包装类是不可修改的,而原子变量类是可修改的,在原子变量类中没有重新定义hashCode或equals方法,每个实例都是不同的,不宜用做基于散列的容器中的键值。
2.原子变量提供与volatile类型变量相同的内存语义,原子变量更加适合用于实现计数器、序列发生器和统计数据收集
锁的劣势:
1.锁能采用独占方式来访问这些变量,并且对变量的任何修改对随后获得这个锁的其他线程都是可见的,当在锁上存在激烈的竞争时,挂起和恢复线程等过程中存在着很大的开销。
volatile是一种轻量级的同步机制
使用volatile变量时不会发生上下文切换或线程调度等操作。volatile存在一些局限:虽然它们提供了相似的可见性保证,但不能用于构建原子的复合操作。用来确保将变量的更新操作通知到其他线程,编译器与运行时都会注意到这个变量是共享的,因此不会讲该变量上的操作与其他内存操作仪器重排序,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方
CAS机制:
1.当多个线程尝试使用CAS同时更新一个变量时,只有其中一个线程能更新变量的值,而其他线程都将失败,失败的线程并不会被挂起(这与获取锁的情况不同:当获取锁失败时,线程将被挂起),而是被告知在这次竞争中失败,并可以再次尝试
2.CAS主要缺点:它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题(线程在获得锁之前将一直阻塞)
3.CAS的性能会随着处理器数量的不同而变化很大