[多线程系列]多线程基础之CAS

CAS(compare and swap) 比较和交换
概述
        cas在多线程中是一个保持同步的原子指令。它将内存中指定位置的值与所期望的值比较,只有当内存当中的值和期望的值相同的时候,
    才会把内存中的值更新为一个新的值,这是一个原子的操作。如果内存中的值同时被其他线程操作那么此次更改将会失败。
实现
        cas得到大多数架构的处理器的支持,可以在cpu层面上使用指令来实现,是现在最常用的非阻塞同步锁的实现方式。在java语言中1.6
    以后添加了语言对于cas的支持,主要集中在concurrent下面的atomic包中,例如AtomicInteger,AtomicLong等的incrementAndGet()方法
适用场景
        在轻度到中度的争用情况下,非阻塞算法的性能会超越阻塞算法,因为 CAS 的多数时间都在第一次尝试时就成功,而发生争用时的
    开销也不涉及线程挂起和上下文切换,只多了几个循环迭代。没有争用的 CAS 要比没有争用的锁便宜得多(这句话肯定是真的,
    因为没有争用的锁涉及 CAS 加上额外的处理),而争用的 CAS 比争用的锁获取涉及更短的延迟。在高度争用的情况下(即有多个
    线程不断争用一个内存位置的时候),基于锁的算法开始提供比非阻塞算法更好的吞吐率,因为当线程阻塞时,它就会停止争用,
    耐心地等候轮到自己,从而避免了进一步争用,所以cas更适合在冲突比较少的环境中能提高更高的性能。
总结
        cas是cpu的执行原子操作的指令,java语言中有相关实现,适用在冲突少的环境中使用,是java并发编程的基础概念!

原文地址:https://www.cnblogs.com/coldridgeValley/p/4979524.html