大型网站团队人数,做设计网站模块的网站,山东酷雅展陈装饰有限公司,数据库网站有哪些源于#xff1a;XX网#xff0c;如果冒犯#xff0c;表示歉意 面试官#xff1a;什么是CAS 我#xff1a;这个简单#xff0c;开心锁 面试官#xff1a;WTF#xff1f; 我#xff1a;一脸自信#xff0c;对#xff0c;就是这个 面试官#xff1a;哈哈大笑#xff… 源于XX网如果冒犯表示歉意 面试官什么是CAS 我这个简单开心锁 面试官WTF 我一脸自信对就是这个 面试官哈哈大笑哈哈~ 回去等通知吧 我WFT笑啥呢 观众下午刚被拒绝瞬间被你治愈。。抑郁症都被治好了 CAS含义
compare and swap翻译过来就是比较并替换。内存地址V旧的预期值A要修改的新值B。俗称乐观锁
那么乐观锁的定义是什么呢
乐观锁是对于数据冲突保持一种乐观态度操作数据时不会对操作的数据进行加锁这使得多个任务可以并行的对数据进行操作只有到数据提交的时候才通过一种机制来验证数据是否存在冲突(一般实现方式是通过加版本号然后进行版本号的对比方式实现);
本质上是CPU的一个指令集能够提供的一个操作此操作是不停的for 循环不停的去用这个指令去获取某个内存的地址如果获取到了则代表获取到了锁。
举个底层源码的列子AtomicInteger中的方法 是一个do while循环的操作这里有2个操作 1. v getIntVolatile(o, offset) 用于获取对象中偏移地址对应的整型的值。其中o 表示对象offset 表示偏移量。这个方法会返回共享内存中的 value 值通过 volatile 控制值的可见性确保从内存里拿到的值是当前最新的值。 2. weakCompareAndSetInt(o, offset, v, v delta) 用于比较内存中的值旧值是否相等如果相等就把修改后的值写到内存中返回true。表示修改成功。 其中o 表示对象offset 表示偏移量v 和 vdelta 分别表示期望值和新值相同就表示这期间没有其它的线程来修改这个值。这个方法是原子性的也就是说在执行过程中不会被其他线程打断。 它的底层是一个Native方法 英文说明
如果Java变量当前持有预期值则自动更新为x。 该操作具有易失性读写的内存语义。对应C11 atomic_compare_exchange_strongC。 返回: 成功则为真
写了个demo
1.简单的进行加一期待值跟实际值的比较 2. 让2个线程竞争上岗 CAS会产生什么问题
1.对的就是你想的那个ABA的问题
解决方式通过版本号每次进行比较跟交换的时候比较时间戳/版本号进行比较
2.底层实现是通过while操作不了就一直循环长时间循环的话会导致CPU空转消耗资源
解决方式需要控制自旋次数
3. 它只能保证一个变量的原子操作而不能保证一个代码块的原子性