java volatile

转载 2012年03月22日 13:01:44
volatile关键字有什么用?
  恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码 或方法;看如下三句get代码:
int i1;                          int geti1() {return i1;}
volatile int i2;              int geti2() {return i2;}
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消耗更多资源。

相关文章推荐

Java线程:volatile关键字

  • 2012-05-17 16:46
  • 30KB
  • 下载

java并发编程之——volatile详解

java并发编程之——volatile详解 注:此篇文章转载自http://www.cnblogs.com/dolphin0520/p/3920373.html    volatile这个关键...

java 中volatile的理解参考

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题...

彻底弄明白之java多线程中的volatile

转  http://www.cnblogs.com/dolphin0520/p/3920373.html  volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,...

Java内存模型与volatile关键字

Java内存模型(Java Memory Model)Java内存模型(JMM),不同于Java运行时数据区,JMM的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取...

java多线程之内存可见性-synchronized、volatile

1、JMM:Java Memory Model(Java内存模型)关于synchronized的两条规定:   1、线程解锁前,必须把共享变量的最新值刷新到主内存中   2、线程加锁时,将...

Java并发实践:volatile的原理和使用

写这篇文章的缘由是因为之前师弟的一个问题,想要的实现停止线程执行的功能。【实际需求】点击一个按钮开始执行一个长期运行的任务,然后点击另外一个按钮则任务停止执行。【问题分析】看到这个问题的第一个想法就是...

Java的volatile修饰符

Java的volatile修饰符是和多线程编程相关的,被volatile修饰的变量当其状态被某一个线程修改是,其状态被其他线程可见。volatile变量不会缓存在寄存器或者其他处理器不可见的地方。下面...

java中volatile关键字的含义

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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