作者dream1124 (全新开始)
看板java
标题Re: [问题] volatile这个该死的修饰词到底是干嘛用的
时间Mon Apr 18 14:57:19 2011
※ 引述《pzyc79 (English Idiot 简称EI)》之铭言:
推你的研究精神! 学程式就该这样做
这个问题我曾经花一个暑假仔细研究过,并写了一系列文章供人参考︰
http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?t=6280
你可以参考 volatile 那小节
: 如题
: 我已经找过google、javaworld都找不到满意的答案
: 要嘛就是说他是什麽强制Thread不能用内存要去读记忆体 没范例
: 要嘛就是有简单的程式范例 但是我实作结果又跟说的不一样
: 1.class Test {
: 2. static volatile int i = 0, j = 0;
: 3. static void one() { i++; j++; }
: 4. static void two() {
: 5. System.out.println("i=" + i + " j=" + j);
: 6. }
: 7.}
: 这个
: 他说i和j会同时更新 但是印出来i和j还是会不一样啊
如果有文献跟你讲上面例子的变数用 volatile 修饰过可以让 i 和 j 印出来一样
那个资料可以直接丢了!!!这根本和 volatile 没什麽直接关系!!
在概念解释之前,你要先知道,JVM 不是单指一支摆在 Oracle 官网供你下载的程式
JVM 只是一个执行 Java bytecode 的软体规格。
凡是有照规格做出来可以执行 java bytecode 的程式都算是 JVM,
你 JVM 的能力可以做得跟规格一样,也可以做得比规格书要求的更多
原始官方 JVM 规格对 volatile 修饰字的要求很简单,大意就只有这样︰
「不同执行绪对 volatile 修饰过的变数存取之间要存在 happens-before 关系」
至於什麽是 happens-before? 因为官网解释又臭又长还不直观,
我简单精简成一个重点︰
「读取 volatile 变数的执行绪,要能读得到最後更新的值。」
只要那个 JVM 能让 volatile 变数达到上述效果,就符合规格啦~
volatile 修饰字的效果,也就仅仅这样而已~
就算你再怎麽不解,规格书上定义的效果也就只有这样....
: 这个
: 他说如果不用volatile会导致无限循环 可是明明不写volatile呼叫tellMeStop
: 他还是会停下来阿
: 到底是怎样我快疯了
这个问题,我觉得是因为现在 JVM 做的远比规格还要多
老实说,要用现在的 JVM 跑程式证明多执行绪下,
变数有没有 volatile 修饰究竟差在哪,还真是难~~
我写过很多程式想证明这件事,却发现总是很难分离其他影响因素.
例如常常一不小心为了用不同变数比较执行效果,就跟 synchronized 混在一起了。
问题是规格书也要求 synchronized 区域里面的变数要有 happens-before 关系,
一旦混在一起,根本就没办法证明 happens-before 效果究竟是从哪个语法来的。
而且有时候 JVM 似乎会自动帮你解决这些 memory inconsistency 的问题,
这让我们更是感觉不到 volatile 究竟是什麽,它又在干麻....
你现在的情境就好像是拿不完全正确的 html 语法去给浏览器跑,
结果却发现还是有画面一样....
虽然语法有一些可能会造成问题的点,但因为浏览器做的比规格要求的还多,
所以最後还是能显示....
至於你提到的暂存器问题,那只是底层为了做到 volatile 规格定义的效果所做的
一些事,其实重点不是底层究竟做了哪些事,而是 volatile 究竟有什麽效果
这部分才是学语言该聚焦的地方
你现在会看到那些不知所云的资料,多半因为它想用底层的实作方式解释 volatile
定义的效果....但这教法只有说给那些学过底层的人听才合适
这就像是刚学程式语言,不懂 class 是什麽概念的人,解答的人却用一堆底层的
细节来说明,只是徒增听者的困扰而已....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.136.155.111
1F:推 cooper6334:用恐龙本的说法,volatile会让存取变数变atomically罗? 04/18 15:28
※ 编辑: dream1124 来自: 140.136.160.132 (04/18 16:46)
2F:推 aecho:回一楼,是的。所以可以代替synchonized昂贵的lock/unlock 04/19 08:14
3F:推 tomap41017:推这篇文章,感谢大大一个暑假的心得分享:) 04/19 21:52
4F:→ calais007:我以前也是知道volatile功能但却找不到code来验证他 04/20 21:52
5F:推 kiffy:推好文 05/06 10:54