1. 处理器如何实现原子操作
1.1 使用总线锁
1.2 使用缓存锁
2. Java如何实现原子操作
2.1 偏向锁
线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否 存储着指向当前线程的偏向锁。
-
如果测试成功,表示线程已经获得了锁。
-
如果测试失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):
2.1 如果没有设置,则使用CAS竞争锁;
2.1 如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程。
2.2 使用循环CAS
具体实现细节
JVM中的CAS操作正是利用了处理器
提供的CMPXCHG指令
实现的。
自旋CAS实现的基本思路
就是循环
进行CAS操作
直到成功为止。
CAS的三大问题
- ABA问题
- 循环时间长开销大
- 只能保证一个共享变量的原子操作
网友评论