cas原理
cas全称Compare and swap,比较和交换的意思。原子操做,须要硬件的支持。
三个基本操做数:内存地址V,旧的预期值A,要修改的新值B。
举个线程A想执行相加的例子。多线程
- 内存地址V有个值是1。
- 线程A把V的值放在A中。
- 线程A执行V+2,获得的3为B。
- 把A和V的值比较,若是不同,从新执行2的步骤。
- 若是同样,把V的值替换为B。
synchronized,volatile,cas
- synchronized:独占锁,会致使其余全部须要锁的线程挂起,等待持有锁的线程释放锁。
- volatile:可见性,不保证原子性。
- cas:乐观锁,不适用锁的状况下实现多线程的变量同步。
缺点
- ABA问题:在上面例子中,若是V的值是1,被B线程变成2,再被A线程变成1,那么对于A线程来讲,仍是当作没有变化。解决的办法就是加版本号。
- 性能问题:在并发量较高的状况下,若是一直不成功,会一直增长CPU的开销。
- 只能保证一个共享变量的原子操做