再次回顾以下之前提到的实现线程安全的方法Java多线程理论基础
- 互斥同步: synchronized 和 ReentrantLock
- 非阻塞同步: CAS, AtomicXXXX
- 无同步方案: 栈封闭,Thread Local,可重入代码
其中就提到了CAS,它是一个非阻塞的同步,非阻塞是什么,CAS又是什么呢?
什么是CAS
CAS的全称是Compare-And-Swap(对换比较)。它是一条基于硬件实现的**原子指令,**其作用是让CPU先进行比较两个值,新值和旧值是否相等:
- 如果不相等,那么将旧值用新值替换,
- 如果相等,说明旧值没有变化,则不替换
什么是非阻塞呢
有非阻塞那就对应的有阻塞: 之前学习的互斥同步 最主要的问题就是线程阻塞与唤醒所带来的性能问题,因此互斥同步也称为阻塞同步。 互斥同步属于一种悲观的并发策略,总是认为共享数据一定会出现多线程竞争,总是对共享资源加锁。 CAS的全称是比较并交换(Compare-and-Swap,CAS),它是一种乐观的并发策略:先进行操作,如果没有其他线程争用共享资源,那就操作成功,否则采取补偿措施,不断地重试,直到成功为止。因此这种并发策略是不需要阻塞线程的,所以称之为非阻塞同步 因此我们耳熟能详的乐观锁,悲观锁的典型代表就是CAS和**synchronized,**并不是什么新的概念。