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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ORA-12154:TNS:无法处理服务名

    ORA-12154:TNS:无法处理服务名环境:PLSQLDeveloper1332位,oracle9i310精简客户端32位因为PLSQLDeveloper1332位默认安装在C盘ProgramFiles(x86)下,就是因为这个路径问题导致会报这个错误,将PLSQLDeveloper安装在其他不包含中文,括号,空格的目录下即可。…

    2022年7月19日
    18
  • 探索WebKit内核(一)—— 菜鸟起步

    探索WebKit内核(一)—— 菜鸟起步

    2021年12月1日
    101
  • sap安装配置_sapgui730安装指南

    sap安装配置_sapgui730安装指南一.下载和安装    WEBIDE是免安装的,下载完解压就行。       下载地址  Developerguid在线文档  在线文档打开会比较慢,可以下载下来观看。二.配置ABAP链接 在IDE的解压文件的配置文件夹中新建文件ER1(没有后缀名)  编辑新建文件添加如下内容:  Description=

    2022年10月18日
    4
  • 移动端fastClick使用

    移动端fastClick使用作为一个新手,插件原理什么的研究不透,看的也是似懂非懂的,网上有很多大牛写的博文相当的好   在这里我只是简单的记录下简单的用法,还请大牛们不吝赐教     为什么存在延迟?     从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约300毫秒的等待时间。为什么这么设计呢?因为它想看看你是不是要进行双击(doubletap)操作。1、引入插件的jav…

    2022年6月19日
    44
  • Excel2JSON Excel转JSON Excel另存为JSON的技巧

    Excel2JSON Excel转JSON Excel另存为JSON的技巧不过欢迎大家转发到微博、微信、朋友圈~么么哒~JSON是码农们常用的数据格式,轻且方便,而直接手敲JSON却是比较麻烦和令人心情崩溃的(因为重复的东西很多),所以很多码农可能会和我一样,选择用Excel去输入数据,然后再想办法转换成JSON格式。小编今天推荐使用Excel直接另存为JSON的方法。该方法的特点是:除可以正常的直接按照表头作为key,内容作为value输出之外,还可以

    2022年6月14日
    25
  • python官网下载步骤-windows下载并安装Python的具体步骤

    python官网下载步骤-windows下载并安装Python的具体步骤安装Python下载并安装PythonPython的官网是www.python.org,我们可以直接从官网下载Python。这里介绍在微软Windows和苹果MacOS两种系统中的安装方式。如果Python官网页面之后有所更新,那请大家用自己的思维能力和观察力,大胆地尝试,推测如何下载安装,解决问题。1.5.1Windows系统进入https://www.python.org/页面,选…

    2022年5月1日
    88

发表回复

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

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