为什么各种书籍和面试题都说CAS是无锁操作?实现的时候不…

为什么各种书籍和面试题都说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的锁不太一样,不用切换到内核态所以更轻量级。