天天看点

《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记一、锁的劣势二、硬件对并发的支持三、原子变量类四、非阻塞算法

锁定后如果未释放,再次请求锁时会造成阻塞,多线程调度通常遇到阻塞会进行上下文切换,造成更多的开销。

在挂起与恢复线程等过程中存在着很大的开销,并且通常存在着较长时间的中断。

锁可能导致优先级反转,即使较高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别。

处理器填写了一些特殊指令,例如:比较并交换、关联加载/条件存储。

1 比较并交换

CAS的含义是:“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不需要修改告诉V的值实际为多少”。CAS是一项乐观锁技术。

模拟CAS操作例子:

2 非阻塞的计数器

基于CAS实现的非阻塞计数器

CAS的主要缺点是:它将使调度者处理竞争问题(通过重试、回退、放弃),而在使用锁中能自动处理竞争问题(线程在获得锁之前将一直阻塞)。

3 JVM对CAS的支持

1 原子变量是一种“更好的volatile”

通过CAS来维持包含多个变量的不变性条件例子:

2 性能比较:锁与原子变量

使用ReentrantLock、AtomicInteger、ThreadLocal比较,通常情况下效率排序是ThreadLocal > AtomicInteger > ReentrantLock。

1 非阻塞的栈

2 非阻塞的链表

CAS基本使用模式:在更新某个值时存在不确定性,以及在更新失败时重新尝试。

3 原子的域更新器

原子的域更新器类表示有volatile域的一种基于反射的“视图”,从而能够在已有的volatile域上使用CAS

4 ABA问题

处理V的值首先由A变成B,再由B变成A的问题。

下一篇: IPMI 备忘录