Java并发编程-原子变量与非阻塞同步

原子变量与非阻塞同步

近年来的非阻塞并发算法很火热。这种算法底层使用原子机器指令代替锁,来保证一致性。

非阻塞算法应用在操作系统和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?如果这个问题会影响系统的正确性,那么需要有额外的方式来保证正确性。例如加上版本号。