多线程
CAS(比较并交换)你知道吗?
❒ CAS的全称是:Java中的CAS全称为"Compare-And-Swap"(比较并交换)。它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。CAS操作包含三个参数:预期值(Expected Value, V)、目标值(Target Value, A)和更新值(New Value, B)。其核心思想是: ✔ 预期值:线程期望变量当前的值 ✔ 目标值:变量在内存中的实际值 ✔ 更新值:线程希望将变量更新为的新值 ❒ 在JUC(java.util.concurrent)包下实现的很多类都用到了CAS操作 ✔ AbstractQueuedSynchronizer (AQS框架) ✔ AtomicXXX类 ❒ 乐观锁和悲观锁 ✔ CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。 ✔ synchronized是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。
❒ CAS你知道吗? ✔ CAS的全称是: Compare And Swap(比较再交换);它体现的一种乐观锁的思想,在无锁状态下保证线程操作数据的原子性。 ✔ CAS使用到的地方很多: AQS框架、AtomicXXX类。 ✔ 在操作共享变量的时候使用的自旋锁,效率上更高一些。 ✔ CAS的底层是调用的Unsafe类中的方法,都是操作系统提供的,其他语言实现乐观锁和悲观锁的区别。 ✔ CAS是基于乐观锁的思想: 最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。 ✔ synchronized 是基于悲观锁的思想: 最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。