假定有两个操作 A 和 B,如果从执行 A 的线程来看,当另一个线程执行 B 时,
要么将 B 全部执行完,要么完全不执行 B,那么 A 和 B 对彼此来说是原子的。
synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,
访问同一资源的其它线程需要等待,直到该线程释放锁
CAS操作如下:
CAS 实现原子操作的三大问题
ABA 问题。
因为 CAS 需要在操作值的时候,检查值有没有发生变化,如果没有发生变化
则更新,但是如果一个值原来是 A,变成了 B,又变成了 A,那么使用 CAS 进行
检查时会发现它的值没有发生变化,但是实际上却变化了。
循环时间长开销大。
自旋 CAS 如果长时间不成功,会给 CPU 带来非常大的执行开销。
只能保证一个共享变量的原子操作。
当对一个共享变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操
作,但是对多个共享变量操作时,循环 CAS 就无法保证操作的原子性,这个时候
就可以用锁。