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消耗更多资源。

【OpenJudge】c语言_苹果和虫子

苹果和虫子 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每...
  • cldance
  • cldance
  • 2016年07月28日 09:36
  • 1350

volatile关键字的介绍和使用

Java关键字volatile的介绍
  • a284266978
  • a284266978
  • 2016年03月12日 18:11
  • 2021

关键字volatile的作用和三个不同的应用场合

学习C关键词的时候,我们看到了一个新面孔——volatile。在程序员面试宝典中提到“关键字volatile的面试例题是考查嵌入式编程”,中间有一段解析: 回答不出这个问题的人是不会被雇佣的。我...
  • KayChanGEEK
  • KayChanGEEK
  • 2016年01月25日 12:29
  • 4728

volatile关键字有什么用?

也可以在CSDN上搜索“volatile”tag获得更多volatile关键字有什么用?2007-04-29 18:06恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。...
  • galford222
  • galford222
  • 2007年06月08日 11:35
  • 336

volatile关键字有什么用

 恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码: int ...
  • jnucstan
  • jnucstan
  • 2007年06月09日 17:24
  • 324

关键字volatile的含义及使用

volatile的本意是“易变的” C语言书籍这样定义volatile关键字:volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接...
  • passerbyyuan
  • passerbyyuan
  • 2016年07月11日 21:39
  • 1277

关键字volatile有什么含意 并给出三个不同的例子

关键字volatile有什么含意 并给出三个不同的例子
  • zhang_yin_liang
  • zhang_yin_liang
  • 2016年07月24日 19:36
  • 844

volatile的适用场景(面试问题:volatile有什么作用)

把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。 原子性意味着个时刻,只有一个线程能够执行一段代码,这段...
  • hxpjava1
  • hxpjava1
  • 2017年02月15日 09:37
  • 745

Volatile关键字的作用

一.前言 1.编译器优化介绍: 由 于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一 定严格...
  • DEV_linux
  • DEV_linux
  • 2015年04月02日 11:10
  • 5299

java中的volatile关键字的功能详解

Cookie的应用场景: 1,记录用户的登陆状态,提示用户是否记住密码; 2,购物车购物功能; 我们知道,在web开发过程中,我们都要和cookie打交道,有时候离开了cookie还真玩不转。co...
  • reggergdsg
  • reggergdsg
  • 2015年12月11日 22:01
  • 2313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:volatile关键字有什么用?
举报原因:
原因补充:

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