后端原理实验室

JAVA · 并发实验

count++,拆开看

两个线程各加 1。跟着读、改、写,看看一次更新怎样丢失。

交互模拟 · 非 JVM 运行
共享变量int count = 0;
count0
两个线程各执行一次count++期望最终值 2
没有互斥保护,读、改、写可以交错

A线程 A

待执行
局部值 rA—
  1. 读rA = count
  2. 改rA = rA + 1
  3. 写count = rA

B线程 B

待执行
局部值 rB—
  1. 读rB = count
  2. 改rB = rB + 1
  3. 写count = rB

准备开始

初始值为 0,两个线程还未读取

点「下一步」,先让线程 A 读取 count。

执行时间线

一种会丢失更新的交错

0 / 6

    从上到下执行 · 高亮为刚完成的一步

    一行代码,不是一个原子操作

    count++ 需要读取旧值、加 1、写回。两次读取如果都得到 0,两次写回就可能都是 1。

    锁要保护完整的读、改、写

    两个线程使用同一个 mutex 对象,并把整个操作放进同步块。后进入的线程读取前一个线程写入的值。