A线程 A
待执行局部值
rA—synchronized (mutex) {- 读
rA = count - 改
rA = rA + 1 - 写
count = rA
}JAVA · 并发实验
两个线程各加 1。跟着读、改、写,看看一次更新怎样丢失。
rA—synchronized (mutex) {rA = countrA = rA + 1count = rA}rB—synchronized (mutex) {rB = countrB = rB + 1count = rB}准备开始
点「下一步」,先让线程 A 读取 count。
执行时间线
从上到下执行 · 高亮为刚完成的一步
count++ 需要读取旧值、加 1、写回。两次读取如果都得到 0,两次写回就可能都是 1。
两个线程使用同一个 mutex 对象,并把整个操作放进同步块。后进入的线程读取前一个线程写入的值。