首页 > 代码库 > 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关键字
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。