首页 > 代码库 > volatile关键字

volatile关键字

  volatile在英文字典的解释是“易变的,不稳定的”,这也是volatile关键字的语义。

  如果使用volatile去申明一个变量,就等于告诉虚拟机,这个变量极有可能会给某些程序或者线程修改。为了确保被修改之后应用程序范围内的所有线程都能够“看到”或者知道。虚拟机就会采用一些手段,保证这个变量的可见性等特点。

  根据编译器的优化规则,如果不使用volatile申明变量,那么这个变量被修改后,其它线程可能并不会被通知到,甚至在别的线程中,看到变量的修改顺序都会是反的。但一旦使用volatile,虚拟机就会特别小心地处理这种情况。

  volatile对于保证操作的原子性是有非常大的帮助,但是注意的是volatile并不能代替锁,它无法保证一些复合操作的原子性例如:

static volatile int i = 0;
public static class PlusTask implements Runnable{
    public void run(){
        for(int k = 0 ; k < 10000 ; k++){
        	i++;
        }
    }
}
public static void main(String[] args) {
	Thread[] threads = new Thread[10];
	for(int i = 0 ;i < 10 ; i ++){
		threads[i] = new Thread(new PlusTask());
		threads[i].start();
	}
	for(int i = 0 ; i < 10 ; i ++){
		threads[i].join();
	}
	System.out.println(i);
}

  如果i++是原子性的那么最终的值应该是100000.但实际上,上述代码的输出总是会小于100000.

  此外,volatile也能保证数据的可见性和有序性。

volatile关键字