Thread.MemoryBarrier 方法

Thread.MemoryBarrier 方法classFoo{int_answer;bool_complete;voidA(){_answer=123;_complete=true;}voidB(){if(_complete)Console.Wri…

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

class Foo
{
    int _answer;
    bool _complete;
    void A()
    {
        _answer = 123;
        _complete = true;
    }
 
    void B()
    {
        if (_complete) Console.WriteLine(_answer);
    }
}
 
如果A和B是运行在2个并行的线程上,B有可能打印出0。
出于2中原因:
 
1,编译器,CLR或者CPU可能重新排序了程序指令,以此提高效率。
2,编译器,CLR或者CPU引入缓存优化导致其他的线程不能马上看到变量值的更改。
 
使用Memory barrier可以防止重新排序程序指令或者缓存。调用Thread.MemoryBarrier就是实现一个Memory barrier。
 
class Foo
{
    int _answer;
    bool _complete;
    void A()
    {
        _answer = 123;
        Thread.MemoryBarrier(); // Barrier 1
        _complete = true;
        Thread.MemoryBarrier(); // Barrier 2
    }
    void B()
    {
        Thread.MemoryBarrier(); // Barrier 3
        if (_complete)
        {
            Thread.MemoryBarrier(); // Barrier 4
            Console.WriteLine(_answer);
        }
    }
}
 
Thread.MemoryBarrier()按如下方式同步内存访问:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier 调用之后的内存访问,再执行 MemoryBarrier 调用之前的内存访问的方式。
调用一次MemoryBarrier大约花费10纳秒.



















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/526398
,如需转载请自行联系原作者



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

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

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


相关推荐

  • Kafka基本原理详解(超详细!)

    Kafka基本原理详解(超详细!)目录一、概念理解(1)产生背景(2)Kafka的特性(3)Kafka场景应用(4)Kafka一些重要设计思想二、消息队列通信的模式(1)点对点模式(2)发布订阅模式三、Kafka的架构原理(1)基础架构与名词解释(2)工作流程分析(1)发送数据(2)保存数据(1)Partition结构(2)Message结构(3)存储策略(3)消费数据一、概念理解Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消

    2022年5月20日
    47
  • 十分钟读懂『卡尔曼滤波算法』

    十分钟读懂『卡尔曼滤波算法』我是勤劳的搬运工,转自:1.http://blog.csdn.net/karen99/article/details/77717432.http://blog.csdn.net/tudouniurou/article/details/6277512——————————————————————–

    2022年6月29日
    23
  • 解决docker下载镜像速度过慢_docker image是什么

    解决docker下载镜像速度过慢_docker image是什么前言上一篇讲到pull镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的将docker镜像源修改为国内的:在/etc/docker/d

    2022年7月30日
    4
  • (修改gho文件办法)做属于自己个性的gho系统

    (修改gho文件办法)做属于自己个性的gho系统(修改gho文件办法)做属于自己个性的gho系统一修改GHO文件中的注册表:想要修改注册表首先要知道XP系统注册表存放的位置:WindowsXP的绝大部分注册表数据文件存放在C:\WINDOWS\system32\config。该目录里面包含了5个没有扩展名的文件,即当前注册表文件:  DEFAULT(默认注册表文件,位于注册表的HKEY_USERS项分支下…

    2022年7月12日
    34
  • matlab语法 axis on,matlabaxis

    matlab语法 axis on,matlabaxis编程语言中文网今天精心准备的是《matlabaxis》,下面是详解!Matlab里axis这个函数怎么用,举个例子!axis函数可以用于操作普通的坐标属性(轴的缩放和外观)。比如:axis([xminxmaxyminymax]):可以设置当前坐标轴x轴和y轴的限制范围axis([xminxmaxyminymaxzminzmaxcmincmax])可以设置x,y…

    2022年6月13日
    40
  • linux应急响应检查项_centos7查看服务状态

    linux应急响应检查项_centos7查看服务状态上一篇文章说到Windows的应急响应排查,本篇文章就来说说Linux的应急响应排查。首先,前期交互这部分的内容还是不能少的,毕竟掌握的信息越多,排查的思路就越清晰。Part1熟悉主机环境 uname-a cat/proc/version lsb_release-a 首先,先对排查主机的基本信息有一个了解。Part2运行进程排查首先熟悉一下ps命令的参数:ps[选项] -e显示所有进程。…

    2022年9月15日
    0

发表回复

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

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