请问使用乐观锁,为什么不会在比较完成功然后写回的时候,遭遇其他线程的更改?

2020-08-19 18:34:30 +08:00
 chwangtenger

这是由什么机制来保障的?看一些文章里都没有讲这个呀,很疑惑。

1659 次点击
所在节点    程序员
13 条回复
luckyrayyy
2020-08-19 18:41:38 +08:00
compare and swap,是 cpu 级别保证的原子操作,不会出现比较和修改之间插入别的操作。
chwangtenger
2020-08-19 18:43:42 +08:00
CAS 是一条 CPU 并发原语
wysnylc
2020-08-19 18:59:11 +08:00
@luckyrayyy #1 会有 ABA 的问题
312ybj
2020-08-19 19:09:02 +08:00
compareAndSet*函数是在 unsafe 包里,是 native 函数。源码在.cpp 文件里,都是贴近 cpu 的机器语言。我是看不懂。我就是这样记的,无锁的线程安全
gotonull
2020-08-19 19:16:43 +08:00
因为比较和写入这 2 步是原子操作
cheng6563
2020-08-19 19:18:16 +08:00
不是不会被修改,是能检测到被其他线程修改了,然后报错或重试
luckyrayyy
2020-08-19 19:49:39 +08:00
@wysnylc 这是另一个问题
laminux29
2020-08-19 19:51:17 +08:00
现在的 CPU,有一条指令,叫原子操作指令。

该指令的意思是:

当某个核,发出这条指令后:
1.如果当前环境有多个核,那么它会阻止其他所有核的操作,当它操作完毕后,其他核才能继续操作。

2.操作系统会阻止运行在当前核上面的其他线程的切换操作。

这样就确保了,别的线程,不会更改在这个操作执行期间的数据。
VDimos
2020-08-19 20:14:55 +08:00
原子操作不会被中断
OysterQAQ
2020-08-19 20:44:12 +08:00
查一下 原语 的概念
useben
2020-08-19 21:50:14 +08:00
cpu 锁 /缓存锁
wysnylc
2020-08-20 10:02:26 +08:00
@luckyrayyy #7 是同一个问题,ABA 就会导致在比较和修改之间有别的操作而且最终修改是成功无感知的
SmiteChow
2020-08-20 14:06:23 +08:00
因为 mysql 引擎执行 sql 是原子性的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/699705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX