为什么各种书籍和面试题都说CAS是无锁操作?实现的时候不还是使用unsafe方法调用CPU指令,加了LOCK前缀锁住了缓存,在读取的变量写入之前禁止其他线程读取。还有ABA问题,从实现上看根本不存在这种问题啊。而且互斥锁不就是在这个基础上通过系统调用让线程阻塞吗?
楼主:而且MVCC也不是乐观锁,innodb的实现还是加了锁
程序猿.曹丕:M
宋兵甲:m
程序猿.丹青生:m
楼主:有爪哇大佬吗
程序猿.队宠马塞洛:m
安东尼奥刘能:cas是普通cpu指令不需要进内核态
vivo员工:分清楚事物的概念,mvcc写并发高是因为事物不会一直持有锁
美团员工:m
美团点评员工:+1
程序猿.丹青生:我印象中是sync采用的CPU原语指令关中断避免竞争吧,unsafe只是利用堆外内存来存储变量并比较之后处理所以是无锁的,至于aba的问题这个应该好理解吧,只是根据变量值判断不带版本好的话,很可能刚刚修改的数据又被另一个线程还原
殷天正:m
三本程序员:cas调用了汇编指令cmpxchg,lock_if_mp在CPU指令上也会加锁,但是这个锁和java的锁不太一样,不用切换到内核态所以更轻量级。
楼主:还是说只是从Java语义的角度看是没有锁并且存在ABA问题,毕竟操作系统层面的原语操作是要在硬件上加锁的。互斥锁会系统调用陷入内核,用户能感知到线程状态的变化,所以认为是有锁?
大炮黄忠:m
程序猿.狐媚胡梅尔斯:m
三本程序员:cas调用了汇编指令cmpxchg,lock_if_mp在CPU指令上也会加锁,但是这个锁和java的锁不太一样,不用切换到内核态所以更轻量级。