volatile域的使用
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) 对域的访问有锁保护