volatile的应用

优势:

不会引起线程上下文的切换和调度。在多处理器开发中保证了共享变量的“可见性”

java语言规范对volatile的定义:

java允许线程访问共享变量。为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。如果一个变量被声明为了volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。

原理:

为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存中的数据读到内部缓存后再进行处理。但操作完后不知道何时会写到内存。如果对声明了volatile的变量进行写操作,jvm会向处理器发送一条lock前缀的指令,将这个便来呢所在缓存行的数据写入到系统内存。但是,如果其他处理器的值还是旧的,再执行计算操作就会有问题。所以在多处理器下,为了保证各个处理器的缓存是一致,就会实现缓存一致性协议,每个处理器会通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了。当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态,当处理器对这个数据进行修改操作时候,就会重新从系统内存中把数据读到处理器缓存里。

volatile包含以下含义:

(1)Java存储模型不会对valatile指令的操作进行重排序:这个保证对volatile变量的操作时按照指令的出现顺序执行的。

(2)volatile变量不会被缓存在寄存器中(只有拥有线程可见)或者其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。

资料:

正确使用 Volatile 变量

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,394评论 11 349
  • volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,它比synchr...
    是一动不动的friend阅读 390评论 0 0
  • 终究是自己的徒弟。 尹甄洛仔仔细细地为轩辕检查了一下他的身体,只感觉到轩辕的身体,比起一般人强大许多。 并没有什么...
    和煦晴天阅读 199评论 0 0
  • 我我我,不一样的我。只想花一年的时间读一本诗经,如是而已,无它。 诗经 《诗经》是中国古代诗歌开端,最早的一部...
    逗霸君阅读 1,599评论 2 9
  • 继承的应用这个继承是相当神奇的了!写父类元素用了几十行代码,而这里只用了三行把父类具有的行为动作都继承过来,话说回...
    yamei_wu阅读 283评论 1 0