目前可知volatile保证可见性:
- 被volatile修饰的变量被修改后,新的值会从缓存刷新到主存
- 其他线程的该变量失效,其他线程需要重新从主存获取新值
情景:
举例 count++操作,该操作分为三步:
- 从主存读取count值,缓存到缓存区
- 将线程缓存区的count值加1
- 将缓存区的值写回到主存
多线程下的问题:
假设count初始值为 0 ,假设有线程A、B对 被 volatile 修饰的 count 做 count ++ 操作:
- 线程A 从主存获取count值 0 ,缓存到自己的缓存区
- 线程B 从主存获取count值 0 ,缓存到自己的缓存区
- 线程A 将缓存区 count 加 1 ,此时A缓存区 count = 1
- 线程B 将缓存区 count 加 1 ,此时B缓存区 count = 1
- 线程A 将 缓存区中的count值刷新到主存,主存 count = 1
- 线程B 缓存区 count 值失效,从主存重新拉取 count = 1
- 线程B 的 count++ 三步原子操作已完成前两步(第 4 步 已完成加1操作),此时进行第三步原子操作,将缓存中的 count = 1刷新到主存
- 主存中最终数据 count = 1