标签:使用 ble ring div system highlight 英文 情况 print
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也能保证数据的可见性和有序性。
标签:使用 ble ring div system highlight 英文 情况 print
原文地址:http://www.cnblogs.com/loogr/p/7296490.html