show一下java中的volatile的作用
2009-09-06 00:00:00 来源:WEB开发网具体作用就不多讲了,大概就是保证可见性和防止重排序。 其实很早前就知道有这个关键字,试过很多次,总觉得加了和没加效果一样。
这次终于在阅读《java并发程序实践》(顺便义务广告一下,好书)的时候有了灵感,写了一段很普通的代码:
Java代码
public class NoVisibility {
private boolean ready=false;
int num;
private class ReaderThread extends Thread {
public void run() {
int count = 0;
while (!ready)
{
count++;
}
System.out.println(num);
}
}
public static void main(String[] args) throws InterruptedException {
NoVisibility x = new NoVisibility();
x.new ReaderThread().start();
x.num = 43;
x.ready = true;
System.out.println("main Thread end");
}
}
再写一段python来不停地调用它(因为不一定总能出现),不久后就会发现不返回了,ready值的更新一直对ReaderThread线程不可见。如果ready加个volatile就不会有问题了,可以一直运行。
Python代码
import os
i=0
while True:
os.system("java -server NoVisibility")#or os.popen
i+=1
print "run count"+str(i)
感受:
1.java运行时加参数-server用server版的虚拟机出问题几率很高,据说是server才经过大量优化。
2.while (!ready)的循环内如果有System.out操作时,也几乎不出问题,提高了可见性?(这个是我的猜测)
更多精彩
赞助商链接