CAS(compare and swap)
多线程三大特性
在程序中使用多线程的目的是什么?
1、提高效率,增加任务的吞吐量
2、提升CPU等资源的利用率,减少CPU的空转
多线程的应用在日常开发中很多,带来了很多的便利,但也有要注意问题,一般主要从这三个方面考虑
一、原子性
原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。
二、可见性
可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。
三、一致性
有序性是指程序在执行的时候,程序的代码执行顺序和语句的顺序是一致的。那为什么会出现不一致的情况呢?这是由于重排序的缘故。
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序;重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。
CAS
CAS 的意思是 compare and swap,比较并交换。cas的引入是为了解决java锁机制带来的性能问题。锁机制存在以下问题:
(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。
(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。
(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。