多线程 - 一个关于Java volatile关键字可见性和原子性的问题

查看:133
本文介绍了多线程 - 一个关于Java volatile关键字可见性和原子性的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

一个变量arg用volatile修饰后,会直接保存在主存中
有两个线程A和B访问它

A和B同时将arg读取到了工作内存
若A对arg进行修改后,会导致B工作内存中的arg缓存无效
所以线程B需要再次从主存中读取arg
这就保证了线程B读取的是arg的最新值

问题:
线程A和线程B都对arg变量进行++操作

++操作的过程为,先读取arg,对arg加1,然后写回主存

假设:
arg初始值为0
线程A读取了arg,阻塞
线程B读取arg,对其++,并写回主存,此时arg=1
根据可见性,线程A工作内存中的arg变量应该会失效
此时线程A需要重新从主存中读取arg=1,然后进行++操作,将结果2写回内存

然而:
看了一些博客,都没有涉及到加粗文字的步骤。

按照这样的说法,arg会被写两次,每次都是1。
线程A读取arg放入工作内存后,线程B的写操作不会影响线程A工作内存中arg变量的缓存。

问:这时候可见性不发挥作用么?

解决方案

volatile保证你每次读取都能读到最新的值,可是并不会更新你已经读了的值,它也无法更新你已经读了的值。

这篇关于多线程 - 一个关于Java volatile关键字可见性和原子性的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆