volatile关键字的疑惑

软件路上的小小白 发布于 2017/08/11 00:08
阅读 214
收藏 1

最近在总结的时候对volatile关键字产生了疑惑,有三个问题

1. 比如我用volatile关键字来修饰一个自定义的Student类,而Student类中有一个非volatile的变量name,那么如果我对某个Student实例中的name属性进行修改,这个算volatile写吗?

2. 如果Student类没有用volatile修饰,而里面的name属性用volatile修饰了,那么修改了name的值,根据volatile内存语义,name会刷会主内存,这时Student实例会被连带刷回主内存吗?

3. 比如Student s = student;这句,student实例用volatile修饰了,然后赋值给了一个局部变量,那么修改这个s会导致volatile写吗?

劳烦各位大神能给出有力的理由,多谢了!

加载中
0
_Code_Monkey_
_Code_Monkey_

我只说一句,volatile修饰的是变量,针对的是变量,不是对象,是变量、变量、变量,三遍

_Code_Monkey_
_Code_Monkey_
回复 @软件路上的小小白 : 从语言层面的某些方面来看,这样理解也可以的
软件路上的小小白
不知道我理解的对不对,volatile修饰的只是栈内的那个引用,而不是堆内的对象实例,是吗
0
osc摸鱼大队长
osc摸鱼大队长

开两个线程,一个一直打印你想知道的参数的值,另一个执行你想知道的情况

0
高小北
这个我不记得了,但是网上关于这个关键字的资料一大堆吧,可以自己查查
软件路上的小小白
网上的文章都是针对volatile语义,以及简单的volatile修饰变量的“一级”层次进行分析的,没有这种“多层次”问题的分析
0
Acce1erator
Acce1erator

你可能是C++的思维,Java的所有Object类型变量都是引用,也就是说,你对变量的修饰只对地址进行了修饰,并不涉及到实体本身。用volatiile修饰的变量,只有对该变量的直接访问会有volatile语义,不具有传递性.

Acce1erator
Acce1erator
回复 @忧郁的小王子 : 不懂c++才不敢妄加评论呐,Java的volatile语义是JLS定义过的,不一定和c++的一样
快乐的一只小青蛙
快乐的一只小青蛙
回复 @Acce1erator : 别闹,我很认真的回答。无论c++还是Java对volatile的作用解释是一样的。曾经看了一些java和c++的volatile不同的说法,不明白一个只懂一种编程语言的人是怎样得到这样的结论的
Acce1erator
Acce1erator
回复 @忧郁的小王子 : 这不是c++大神么,好久不见久仰久仰,那你来回答
软件路上的小小白
我大致懂你的意思了,也就是说只有直接用volatile修饰的变量才具有volatile的语义,而没有用volatile修饰的,哪怕是组合、依赖等关联关系都不会存在volatile语义,多谢了
快乐的一只小青蛙
快乐的一只小青蛙
你怎么知道人家问的不是C++呢?
0
orpherus
orpherus
不会 不会 不会。看jsr133 memory model
软件路上的小小白
这个狠了,哈哈,牛
返回顶部
顶部