volatile关键字有什么用?

转载 2007年09月16日 14:37:00

http://hi.baidu.com/yaolihui/blog/item/a19dc3032d0fa189d43f7cc8.html

 

恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:

  1. int i1;              int geti1() {return i1;}
  2. volatile int i2;  int geti2() {return i2;}
  3. int i3;              synchronized int geti3() {return i3;}

  geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
  而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
  既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗])
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
  因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。

相关文章推荐

C/C++程序员 面试经历总结

最近在找工作,遇到了一些面试题,很惭愧的是很多都没答上来。     现在把一些问题总结一下,算是记录一下面试的经历吧。   一、嵌入式C语言面试回忆 主观题: 1、在嵌入式系统中,volitate的作...

排序算法入门之冒泡排序

在开发中,对一组数据进行有序地排列是经常需要做的事情,所以掌握几种甚至更多的排序算法是绝对有必要的 本文章介绍的是排序算法中较简单的一种算法:冒泡排序 题外话:在深入学习更多排序算法后和在实际使用...

DataGrid的数据直接导入Excel里

前几天项目中有个地方需要将DataGrid的数据直接导入Excel里,以提供给用户下载,在网上找了下,好像都是与下面代码类似的实现:

C++简单排序算法之冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需...

实现奇偶排序(c语言)

===== 第2题:奇偶排序(一) ===== 总时间限制:1000ms内存限制:65536kB 描述输入十个整数,将十个整数按升序排列输出,并且奇数在前,偶数在后。输入输入十...

C语言--冒泡排序法(详细注释)

#include "stdio.h"void main() { int a[10],i,j,k; printf("Input ten num:\n"); for(i=0;ia[i+1]) { k=a[...

七大查找算法(附C语言代码实现)

转自:http://www.cnblogs.com/leezx/p/5719012.html 阅读目录 1、顺序查找 2、二分查找 3、插值查找 4、斐波那契查找 5、树表...

实现分离整数的各个数位(c语言)

===== 第5题:5:分离整数的各个数位 ===== 总时间限制:1000ms内存限制:65536kB 描述 从键盘输入一个任意的三位整数,要求正确地分离出它的百位、十位和...

实现冒泡排序(c语言)

===== 第1题:实现冒泡排序 ===== 总时间限制:1000ms内存限制:65536kB 描述 请根据自己的理解编写冒泡排序算法,数组大小1000以内 输入第一行是n,表示数组的大小 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)