• 请不要在回答技术问题时复制粘贴 AI 生成的内容
chwangtenger
V2EX  ›  程序员

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

  •  
  •   chwangtenger · Aug 19, 2020 · 2947 views
    This topic created in 2275 days ago, the information mentioned may be changed or developed.

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

    13 replies  •  2020-08-20 14:06:23 +08:00
    luckyrayyy
    luckyrayyy
    Aug 19, 2020
    1
    compare and swap,是 cpu 级别保证的原子操作,不会出现比较和修改之间插入别的操作。
    chwangtenger
    chwangtenger
    OP
    Aug 19, 2020
    2
    CAS 是一条 CPU 并发原语
    wysnylc
    wysnylc
    Aug 19, 2020
    3
    @luckyrayyy #1 会有 ABA 的问题
    312ybj
    312ybj
    Aug 19, 2020 via Android
    4
    compareAndSet*函数是在 unsafe 包里,是 native 函数。源码在.cpp 文件里,都是贴近 cpu 的机器语言。我是看不懂。我就是这样记的,无锁的线程安全
    gotonull
    gotonull
    Aug 19, 2020
    5
    因为比较和写入这 2 步是原子操作
    cheng6563
    cheng6563
    Aug 19, 2020 via Android
    6
    不是不会被修改,是能检测到被其他线程修改了,然后报错或重试
    luckyrayyy
    luckyrayyy
    Aug 19, 2020
    7
    @wysnylc 这是另一个问题
    laminux29
    laminux29
    Aug 19, 2020
    8
    现在的 CPU,有一条指令,叫原子操作指令。

    该指令的意思是:

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

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

    这样就确保了,别的线程,不会更改在这个操作执行期间的数据。
    VDimos
    VDimos
    Aug 19, 2020 via Android
    9
    原子操作不会被中断
    OysterQAQ
    OysterQAQ
    Aug 19, 2020 via iPhone
    10
    查一下 原语 的概念
    useben
    useben
    Aug 19, 2020
    11
    cpu 锁 /缓存锁
    wysnylc
    wysnylc
    Aug 20, 2020
    12
    @luckyrayyy #7 是同一个问题,ABA 就会导致在比较和修改之间有别的操作而且最终修改是成功无感知的
    SmiteChow
    SmiteChow
    Aug 20, 2020
    13
    因为 mysql 引擎执行 sql 是原子性的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2700 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:33 · PVG 18:33 · LAX 02:33 · JFK 05:33
    ♥ Do have faith in what you're doing.