浅谈volatile在i++情况下失效

概述

如果你对volatile不陌生的话,应该会知道volatile能够保证共享变量对线程的可见性。
那为什么volatile无法保证 i++ 操作的线程可见性呢?

分析

假设i的初始值为0,现有两个线程,分别为线程1和线程2进行 i++ 操作,我们来分析一下为什么会出现错误。

首先,i++并不是原子操作,我们可以将这个操作拆分为3个步骤。

  1. 线程从主内存把遍历加载到缓存。
  2. 线程执行i++操作。
  3. 线程将i的新值刷新到主内存。

那么进行如下过程,则会发生线程安全问题。

  1. 线程1将变量加载到缓存。但是还没有执行 i++ 操作。
  2. 线程2将变量加载到缓存,然后执行i++操作。
  3. 由于线程2缓存变量已经发生了变化,使得线程1的缓存行无效。
  4. 按我们以前的理解,由于线程1缓存行无效,那线程1应该主动去主内存load最新的值。而实际上并不是这样的,volatile的作用并不是在变量改变的时候,让其他线程重新加载主内存的变量值,而是置其他线程缓存内的变量值无效。也就是说,假如线程1的i值已经被加载到了寄存器,参与i++运算,那么此时即便线程1的i值被置为无效,那线程1的计算结果也会把线程1从主内存刷新到的缓存值覆盖,导致数据错误。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值