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/#anch945322、http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
3、《java并发编程实战》的volatile章节
疑问
1、volatile adj. 不稳定的按我的理解就是它的值是可变的,如果是这样的话,那么只要是非final变量不都是可变的么。但它的作用是用于同步数据成员的,即然这样也应该用synchronzied这个关键字呀,一看名字就知道是干嘛用的,所以搞不懂为什么要用这么一个关键字。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- 探究在C++程序并发时保护共享数据的问题
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例
- c#实现多线程局域网聊天系统
- PHP使用CURL实现多线程抓取网页
- 浅解关于C#多线程的介绍