现在的位置: 首页 > 综合 > 正文

volatile域的使用

2018年06月08日 ⁄ 综合 ⁄ 共 574字 ⁄ 字号 评论关闭

volatile关键字为对一个实例的域的同步访问提供了一个免锁机制。如果你把域声明为volatile,那么编译器和虚拟机就知道该域可能会被另一个线程并发更新

有时候,只是为读写实例的一两个域就使用同步,其带来的开销似乎太大了。这种情况下可以使用volatile关键字

例如,假设一个对象有一个布尔标记,由一个线程设置它的值,而由另一个线程来查询它,那么有以下两个方法

1、使用锁,如下

private boolean done;

public  synchronized boolean isDone(){ return done;}

(这个方法有潜在的隐患:如果另一个线程已经对对象加了锁,isDone方法就会被阻塞)

2、将域声明为volatile

private volatile boolean done;

public boolean isDone(){ return done;}

(当然,访问一个volatile变量比访问一个一般变量要慢,这是为线程安全所付出的代价)

总之,在下面三个条件下,对一个域的并发访问是安全的

(1) 域是 volatile的

(2) 域是final的,并且在构造器调用完成后被访问

(3) 对域的访问有锁保护

网上有一个对volatile的使用总结得还不错

http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

抱歉!评论已关闭.