具体作用就不多讲了,大概就是保证可见性和防止重排序。 其实很早前就知道有这个关键字,试过很多次,总觉得加了和没加效果一样。
这次终于在阅读《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就不会有问题了,可以一直运行。
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操作时,也几乎不出问题,提高了可见性?(这个是我的猜测)
=====2011.3.19=======《java并发编程实践》其实给出个更好的例子===============
由于asleep在循环中没改变,所以在server版的jvm中会被优化,提出循环判断,结果搞成个死循环。这个是必现得
java -server -cp . visibility
public class visibility {
boolean asleep = false;
public void run1()
{
int i=0;
while (!asleep)
i++;
System.out.println(i);
System.out.println("end");
}
public static void main(String[] args) {
final visibility a = new visibility();
new Thread(){
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a.asleep = true;
};
}.start();
a.run1();
}
}
分享到:
相关推荐
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
主要讲述java线程volatile关键字
【Java面试题】volatile的作用
C语言中关键字volatile的作用,使用说明和例子
volatile是java中的关键词之一,这篇文章主要给大家介绍了关于Java中volatile关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下
violate java_Java 之 volatile 超级详解
本篇文章给大家通过实例分享了Java中Volatile的作用,有兴趣的朋友可以学习参考下。
主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下
本文给大家介绍了单片机C语言中volatile的作用。
Java并发编程:volatile关键字解析
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上...
主要介绍了java 中volatile和lock原理分析的相关资料,需要的朋友可以参考下
本篇文章主要介绍单片机中volatile定义的作用,感兴趣的朋友可以看看。
java语言的volatile教程,java语言的volatile关键字到底怎么用
java volatile 关键字 学习
synchronized是阻塞式同步,在线程...这个实际对普通变量没有规定的,而针对volatile修饰的变量给Java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读,从而保证数据的可见性。
volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。这篇文章主要介绍了Java中的volatile关键字,需要的朋友可以参考下
多方面解读Java中的volatile关键字.rar