您的位置:首页 > 编程语言 > Java开发

java volatile关键字

2015-09-13 16:28 309 查看

定义

1、volatile是一个关键字,就跟synchronized是一个关键字一样。

2、volatile关键字和synchronized关键字是jdk5之前提供的最常用的线程同步功能。

作用

volatile的作用是用来解决并发访问数据的问题的,在这方面也跟synchronized关键字一样。

如何使用

volatile写在类的数据成员的前面。

volatile和synchronized的区别

1、volatile写在类的数据成员的前面,而synchronized是写在方法的前面。

2、synchronized对变量(即类的数据成员)的并发访问是如何确保不会发生数据篡改的呢(即要确保所谓的同步)?

答:对这个volatile变量的单个操作是可以确保同步的,具体来说,是任何一个线程在读的时候可以确保这个volatile变量是被所有线程写过的最新的值。

而对这个volatile变量进行多个操作则很可能出现线程同步问题(即可能发生数据篡改、数据不是最新的等情况)。

注:

a.读或写操作都是属于单个操作,而既有读又有写的操作就属于复合操作(或者说是多个操作,反正不是单个操作)。

b.单个操作,指一条jvm指令。

代码示例

//代码说明:get和set这2个方法都是线程同步的,相当于什么呢,相当于2个加了synchronzied关键字的方法去访问非volatile变量;而getAndIncrement方法则不是线程同步的。

class VolatileFeaturesExample {
volatile long vl = 0L;  //使用volatile声明64位的long型变量
//写方法
public void set(long l) {
vl = l;   //写操作:这个只有一个赋值的操作,所以这里的写操作就是属于单个操作
}
//既有读又有写方法
public void getAndIncrement () {
vl++;    //先读后写:这个有2个操作,第一是读操作,第二是计算自增操作(也相当于是写操作),所以这个方法不是属于单个操作
}
//读方法
public long get() {
return vl;   //读操作:这里的读操作也只有一个读的操作,所以也是属于单个操作

}
}


参考

1、http://www.infoq.com/cn/articles/java-memory-model-4/#anch94532

2、http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

3、《java并发编程实战》的volatile章节

疑问

1、volatile adj. 不稳定的

按我的理解就是它的值是可变的,如果是这样的话,那么只要是非final变量不都是可变的么。但它的作用是用于同步数据成员的,即然这样也应该用synchronzied这个关键字呀,一看名字就知道是干嘛用的,所以搞不懂为什么要用这么一个关键字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  volatile 多线程 并发