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,如需转载请自行联系原作者

Thread.MemoryBarrier 方法相关推荐

  1. 从一道面试题分析Thread.interrupt方法

    阿里面试题: public class TestThread {public static void main(String[] args) {Thread t1 = new Thread() {@O ...

  2. java threadgourp_Java Thread getThreadGroup()方法

    Java Thread getThreadGroup()方法 java.lang.Thread.getThreadGroup() 方法返回此线程所属的线程组.它返回null,如果该线程已经死亡(停止) ...

  3. libreportparam2.dll无法继续执行代码_Java并发系列番外(1)——让Thread#stop方法无法终止你的线程...

    众所周知,Thread 类有一个 stop 方法,可以用来终止线程.当然,这个方法连同 suspend,resume 方法一起都已经被弃用了.原因是 stop 方法终止线程过于暴力,不管被 stop ...

  4. Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数

    Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数 学习了:http://www.importnew.com/14958.html 膜拜一下 源码膜拜: Threa ...

  5. java yeild_Java 中 Thread.yield() 方法详解

    对于很多初学 Java 线程的小伙伴们,很容易将 Thread 类里的 yield() 方法理解错误,或者理解得不够透彻,先看下源码: public static native void yield( ...

  6. java并发编程之Thread.sleep方法详解

    Thread.sleep方法的作用: 使当前线程暂停执行一段时间,交出cpu的执行时间片,并且在暂停期间不会参与cpu时间片的获取.直到等待时间结束恢复到就绪状态,是否执行还要看OS的调度,或者在这段 ...

  7. java并发编程之thread.join()方法详解

    thread.join()方法的作用:保证线程的执行结果的可见性.原理是通过阻塞主线程实现的. 代码Demo如下: public class ThreadJoinDemo {public static ...

  8. java thread yield()_Java Thread yield()方法

    Java Thread yield()方法 java.lang.Thread.yield() 方法使当前执行的线程对象来暂停并允许其他线程执行. 1 语法 public static void yie ...

  9. java thread.notify,Java Thread notify()方法

    Java Thread notify()方法 java.lang.Thread.notify() 方法用于唤醒单个线程.此方法仅针对正在等待特定对象的一个线程给出通知.如果我们使用notify() 方 ...

  10. 高并发编程-Thread#join方法的使用及使用场景分析

    文章目录 含义 方法及示例 void join() void join(long millis) join(long millis, int nanos) 使用场景分析 含义 翻看下源码的注释: Wa ...

最新文章

  1. 微信小程序上传图片到服务器不显示,微信小程序上传图片到服务器wx.uploadFile...
  2. 海外投行抢滩大数据 人工智能等领域趋热
  3. 记-纯前端excle下载
  4. 大二暑假周进度报告(五)
  5. 可解释性:对神经网络中层特征复杂度的解释与拆分
  6. java执行linux脚本 并返回其执行结果
  7. java flatmap_Java 8 Steam API map和flatMap方法使用详解
  8. 【渝粤题库】陕西师范大学200591 英语语法
  9. java垃圾收集器、Serial收集器、ParNew收集器、Parallel Scavenge收集器、Serial Old 收集器、CMS收集器、G1收集器、如何查看GC日志
  10. js事件冒泡和事件捕获的区别
  11. 目前见过最好的豆瓣电台第三方程序
  12. 操作系统漏洞检测与利用
  13. 用vb程序设计输出100以内素数和
  14. 2014腾讯校园招聘笔试题
  15. 边写边学Python(14)球落地高度
  16. 企业直播要如何做?硬件设备、网络环境有哪些要求?
  17. Excel 函数大全之查找和引用函数 01 ADDRESS、AREAS、CHOOSE 、CHOOSECOLS、CHOOSEROWS、COLUMN 、COLUMNS教程含使用方法
  18. mybatisPlus插入语句
  19. 计算机网络之网络安全
  20. 入门51单片机(STC8952RC)定时器、有关中断原理简述、寄存器设置与程序示例(包括流水灯和计时器)

热门文章

  1. editormd文件上传
  2. 应广单片机MINI-C编程要点
  3. 《Android移动应用基础教程》之川菜菜谱
  4. 龙芯2h芯片不能进入pmon_基于龙芯2F架构的PMON分析与优化
  5. 思维方式-《策略思维》书中的精髓:生活工作中博弈无处不在,理解博弈论、善用策略思维,能帮助我们做出更好的决策。
  6. rational rose 启动选择_Rational Rose 附使用教程
  7. java 调用 swf 文件上传,swfupload 文件 上传
  8. 《 浩海技术 Ghost XP SP3 快速装机版 V14.0 》 世界杯特别纪念版
  9. 如何把m4a转换成mp3?音频格式转换步骤
  10. 计算机网络管理员二级考试题,计算机网络管理员(二级)操作鉴定试题A