基本概念:
比较 然后 交换 compare and swap
参数:内存值 V,旧的预期值 A,要修改的新值 B
过程:如果 V和 A 相等,则将 V替换 为 B,否则 自旋。
缺点: ABA问题,A 变化为B ,再次变化为A 则检测不出来,需要用加版本号的方式来解决
如果自旋时间太长的话,开销就会很大。
CAS和锁的选择:
1. 在资源竞争不激烈的时候,可以使用CAS,可以在较短时间内获取到锁。
2. 在资源竞争激烈的时候,使用阻塞锁,避免CAS无限制自旋造成的性能开销。
CAS的资源消耗在于,自旋对CPU资源的浪费。
阻塞锁的资源消耗在于,线程上下文切换的开销。
如果要取一个阀值的话,那么
如果线程上下文切换的时间如果大于CAS资源等待获取锁的时间,那么就用CAS;
反之,则用CAS获取锁。