原子变量与非阻塞同步
近年来的非阻塞并发算法很火热。这种算法底层使用原子机器指令代替锁,来保证一致性。
非阻塞算法应用在操作系统和JVM中,实现线程/进程调度机制、垃圾回收机制等其他并发数据结构。
锁的劣势
线程挂起,恢复的开销。线程挂起后不能做任何事情。
Volatile提供了可见性的保证,但是不能构建复合操作。
硬件对并发的支持
早期处理器中的Test-and-Set,Fetch-and-increment。
现代处理器的,Compare-and-Swap,Load-Linked/Store-Conditional
CAS操作的使用场景。先读取,再计算,最后使用CAS修改。一般有while循环。
CAS的性能比锁要高。
JVM对CAS会有支持,在不持支的处理器上使用自旋锁。
原子变量类
AtomicInteger/Long/Boolean/Reference
是一种更好的volatile。
原子变量与锁的性能差异的测试。在竞争程度较高的情况下差不多。在竞争程度适中的情况下原子变量表现更好。
非阻塞算法
使用原子变量可以构造非阻塞的数据结构,例如栈,链表。
非阻塞算法的设计和实现非常困难,但是通常会提供更好的可伸缩性,并有效地防止活跃性问题发生。
ABA问题
原子操作CAS,看到的A是之前的A还是ABA后的A?如果这个问题会影响系统的正确性,那么需要有额外的方式来保证正确性。例如加上版本号。