资讯专栏INFORMATION COLUMN

volatile详解

aikin / 3160人阅读

摘要:内存模型基本概念计算机在执行程序时,每条指令都是在中执行的,而执行指令过程中,势必涉及到数据的读取和写入。有序性即程序执行的顺序按照代码的先后顺序执行。

内存模型基本概念

计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

并发编程中的三个概念

1、原子性
即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
2、可见性
指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
3、有序性
即程序执行的顺序按照代码的先后顺序执行。一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。

Java内存模型

在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。那么Java内存模型规定了哪些东西呢,它定义了程序中变量的访问规则,往大一点说是定义了程序执行的次序。注意,为了获得较好的执行性能,Java内存模型并没有限制执行引擎使用处理器的寄存器或者高速缓存来提升指令执行速度,也没有限制编译器对指令进行重排序。也就是说,在java内存模型中,也会存在缓存一致性问题和指令重排序的问题。

注意,图中的工作内存实际上就对应于硬件层面上的cpu cache。

volatile关键字

它保证了可见性和有序性,但是它不保证原子性。
下面这段话摘自《深入理解Java虚拟机》:

“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”

lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;

它会强制将对缓存的修改操作立即写入主存;

如果是写操作,它会导致其他CPU中对应的缓存行无效。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67011.html

相关文章

  • 一起学并发编程 - Volatile关键字详解

    摘要:比如用修饰的变量,就会确保变量在修改时,其它线程是可见的。。多核环境中,多个线程分别在不同的中运行,就意味着,多个线程都有可能将变量拷贝到当前运行的里。当线程读取变量时,它将能看见被线程写入的东西。 volatile是用来标记一个JAVA变量存储在主内存(main memory)中,多线程读写volatile变量会先从高速缓存中读取,但是写入的时候会立即通过内存总线刷到主存,同时内存总...

    vpants 评论0 收藏0
  • SynchronousQueue原理详解-非公平模式

    摘要:开篇说明本文分析采用的是约定下面内容中代表的是引用地址,引用对应的节点前面已经讲解了公平模式的内容,今天来讲解下关于非公平模式下的是如何进行工作的,在源码分析的时候,先来简单看一下非公平模式的简单原理,它采用的栈这种先进后出的方式进行非公 开篇 说明:本文分析采用的是jdk1.8约定:下面内容中Ref-xxx代表的是引用地址,引用对应的节点 前面已经讲解了公平模式的内容,今天来讲解下...

    cloud 评论0 收藏0
  • Java 中的伪共享详解及解决方案

    摘要:对于伪共享的传统解决方案微信公众号技术栈以上使用此方法的某个版本对伪共享做了优化以下使用此方法中的解决方案中已经提供了官方的解决方案,中新增了一个注解。 1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多线程情况下,如果需要修改共享同一个缓存行的变量,就会无意中...

    BenCHou 评论0 收藏0
  • 40道阿里巴巴JAVA研发岗多线程面试题详解,你能答出多少

    摘要:但是单核我们还是要应用多线程,就是为了防止阻塞。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。 1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓知其然知其所以然,会用只是知其然,为什么用才是知其所以然,只有达到知其然知其所以然的程度才可以说是把一个知识点...

    lpjustdoit 评论0 收藏0

发表评论

0条评论

aikin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<