深入理解volatile关键字的作用(一)

深入理解volatile关键字的作用(一) (一)计算机内存模型大家都知道在计算机执行程序的时候每条指令都是在cpu中执行的,那么执行指令的同时势必会有读取和写入的操作,那么这样就引申出了一个问题。那么在程序运行时数据的存储是在计算机中的主存中(物理内存)的而内存的读取和写入的速度与cpu的执行指令速度相比差距是很大的,这样就造成了与内存交互时程序执行效率大大降低,因此在cpu中就有了高速缓存。 也就说计算机cpu在执行指令时…

大家好,又见面了,我是你们的朋友全栈君。

 

(一)计算机内存模型

大家都知道在计算机执行程序的时候每条指令都是在cpu中执行的,那么执行指令的同时势必会有读取和写入的操作,那么这样就引申出了一个问题。那么在程序运行时数据的存储是在计算机中的主存中(物理内存)的而内存的读取和写入的速度与cpu的执行指令速度相比差距是很大的,这样就造成了与内存交互时程序执行效率大大降低,因此在cpu中就有了高速缓存。

 也就说计算机cpu在执行指令时将主存中的数据复制到高速缓存中,将结果运算完毕后在将运算结果刷新到主存中。废话不多说看图说话

计算机cpu与主存交互

那么大家也看到了计算机cpu会将运算数据复制到高速缓存中。但是这样如果在单线程是没有问题的(单核多线程也是有问题的)本次只是针对多核多线程讨论so 不废话举个栗子

i=i+1;

当同时有两个线程执行这段代码其实我们想得到的结果是2但是呢计算机cpu可不会按照你想的来,其实它会这样执行,假设我们现在有AB两个线程,同时读取了这段代码(假设i变量初始值为0),同时将变量复制到了高速缓存,A线程将数据执行完毕后将变量刷新到主存中i=1,而B线程也同时执行完毕将变量也刷新到主存中i=1,但是AB变量在运算时读取的都是高速缓存的,AB线程的高速缓存是互相不知道其中的值的,那么这样就引申出了缓存一致性问题。

为了解决缓存一致性问题有两种解决办法:

(1)通过总线加LOCK锁的方式

(2)通过缓存一致协议

早期的cpu中是通过在总线加锁来解决缓存不一致的,因为计算机cpu通信是通过总线来执行的,如果在总线上面加锁的话就阻塞来其他cpu对该变量的访问,如上面的代码在程序执行时总线发出lock指令,那么只有在这段代码执行完毕后其他cpu才能读取变量执行相应的指令,这样就解决了缓存一致性问题。

但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。

所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

深入理解volatile关键字的作用(一)

未完待续

参考资料:http://www.cnblogs.com/dolphin0520/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138294.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java8静态变量放在哪个区_jdk8.0 内存划分

    java8静态变量放在哪个区_jdk8.0 内存划分java1.8之前内存区域分为方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。下图所示:方法区(MethodArea)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。很多人都更愿意把方…

    2022年6月12日
    145
  • linux恢复硬盘初始状态,初始化Linux数据盘(fdisk)[通俗易懂]

    linux恢复硬盘初始状态,初始化Linux数据盘(fdisk)[通俗易懂]初始化Linux数据盘(fdisk)TkV南京数据恢复-西数科技:硬盘/手机/SSD数据恢复专家.025-8360863618913825606查看PDFTkV南京数据恢复-西数科技:硬盘/手机/SSD数据恢复专家.025-8360863618913825606分享操作场景本文以云服务器的操作系统为“CentOS7.464位”为例,采用fdisk分区工具为数据盘设置分区。TkV…

    2022年5月27日
    58
  • rsyslog详解

    rsyslog详解一、日志介绍日志概念日志是系统用来记录系统及应用程序运行时的一些相关信息的文本文件日志作用日志是为了保存相关程序的运行状态、错误信息等,为了对系统进行分析、保存历史记录以及在出现错误时发现、分析错误使用linux系统日志类型内核信息服务信息应用程序信息二、rsyslog1、rsyslog介绍rsyslog是linux系统中用来实现日志功能的服务。默认已经安装,并且自动启用。作用:主要用来采集日志,不生产日志其特性包括: 支持输出日志到各种数据库,如MySQ

    2022年9月24日
    3
  • 连接查询和子查询哪个效率高

    连接查询和子查询哪个效率高需要进行多表查询的情况下,用连接查询和子查询哪个效率高?1、什么是子查询?举个简单的例子,那么子查询有什么优劣呢?子查询(内查询)在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用。可以用一个子查询替代上边的的表名。子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询注:在查询时基于未知的值时,应使用子查询子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符通过子查询不难看出,可以根据employee_id查到department_

    2022年5月29日
    234
  • 一般运维架构图「建议收藏」

    一般运维架构图「建议收藏」架构图:整体架构如架构图所示,client端请求通过域名解析访问到服务端负载均衡器slb或者nginx(静态内容存储在阿里云oss并通过cnd加速访问),然后经过安全组过滤,请求最终到达server端,经过业务处理并在阿里云数据库RDS读写数据后返回客户端…

    2022年7月17日
    35
  • 张小龙-年薪近3亿的微信之父,他是如何做到的?

    张小龙-年薪近3亿的微信之父,他是如何做到的?张小龙生于湖南邵东魏家桥镇,家庭主要特点:穷。不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。家有兄弟两人,一个小龙,一个小虎。小虎好动,与邻里打成一片,小龙好静,喜好读书。“文静的像个妹子。”张小龙的表哥如是说。穷文富武,做个读书郎是个不错的选择。87年至94年,华中科技大学本硕连读。本科就读电信系,不喜欢上课…

    2022年6月7日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号