第十五章 原子变量和非阻塞同步机制
1.非阻塞算法
如果在算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就称为非阻塞算法。如果这种算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也称为无锁算法。
这种算法利用底层的原子机器指令代替锁来确保数据在并发访问中的一致性。
2.硬件对并发的支持
2.1 CAS(Compare-and-Swap)
包含3个操作数——需要读写的内存位置、进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子的方式用新值B更新V的值。无论位置V的值是否等于A,都将返回V原有的值。
当多个线程尝试使用CAS同时更新一个变量时,只有其中一个线程能更新变量的值,其他线程都会失败,然而,失败的线程不会挂起。由于一个线程在竞争CAS时失败不会阻塞,因此它可以决定是否重新尝试,或执行一些恢复操作。
2.2 ABA问题
解决方法:每次更新V的值和版本号。
3.原子变量类
原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。比锁的粒度更细,量级更轻。原子变量将发生竞争的范围缩小到单个变量上。
人生就像蒲公英,看似自由,其实身不由己。