1.volatile的原理
volatile的原理实际上是告诉处理器,不要把变量缓存在寄存器或者相对于其他处理器不可见的地方,而是把变量放在主存,每次读写操作都在主存上进行操作。另外,被申明为volatile的变量也不会与其它内存中的变量进行重排序。
2.volatile与同步
volatile是同步的一个子集,只保证了变量的可见性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。
相对于同步而言,volatile的优势
a.简易性,可以像使用其他变量一样使用volatile变量
b.volatile变量不会造成线程阻塞。
c.如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势。
3.正确使用volatile的条件
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中。
对于第一条,如
private volatile int i=1;
...
i++;
虽然i++只有一条语句,实际上这条语句是分三步执行的
读入i,i加1,写入i。
若在第三步执行过程前,其他线程对i进行了改动,此时的结果将是错的。因此即使使用了volatile进行控制,并不能保证这个操作是线程安全的。
这类问题的解决方案有两种:
一种是采用synchronized进行同步控制,这显然违背了volatile的初衷
一种是采用CPU原语进行控制。在jdk1.5之后,java.util.concurrent.atomic包下的很多类就是采用这种方式进行控制,这样可以在保持性能的情况下,保证数据的线程安全。