1.volatile关键字为实例域的同步访问提供了免锁机制。
假定一个对象有一个布尔标记done,它的值被另一个线程设置却被另一个线程查看,如下:
private boolean done;
public synchronized boolean isDone(){return done;}
public synchronized void setDone(){done=true;}
但或许使用内部锁不是个好主意。如果另一个线程已经对该对象加锁,isDone和setDone方法可能阻塞。
这种情况下,将域声明为volatile是合理的:
private volative boolean done;
public boolean isDone(){return done;}
public void setDone(){done=true;}
但volatile变量不能提供原子性。例如,方法
public void flipDone(){done=!done;}
不能翻转域中的值。
2原子性
Java包中提供了某些操作为原子性操作,如自增或自减。这样就无需同步。