Tag: memory barriers

内存屏障和锁定前缀指令之间的区别

在本文内存障碍和JVM并发 !中,我被告知volatile是由不同的内存屏障指令实现的,而synchronized和atomic是通过锁定前缀指令实现的。 但我在其他一些文章中得到了以下代码: java代码: volatile Singleton instance = new Singleton(); 汇编指令(x86): 0x01a3de1d: movb $0x0,0x1104800(%esi); 0x01a3de24: lock addl $0x0,(%esp); 那么哪一个是对的?内存障碍和锁定前缀指令有什么区别而不考虑我的英语不好?

记忆障碍和TLB

内存障碍保证数据缓存一致。 但是,它是否保证TLB一致? 我发现在线程之间传递MappedByteBuffer时,JVM(java 7 update 1)有时会因内存错误(SIGBUS,SIGSEG)崩溃而出现问题。 例如 final AtomicReference mbbQueue = new AtomicReference(); // in a background thread. MappedByteBuffer map = raf.map(MapMode.READ_WRITE, offset, allocationSize); Thread.yield(); while (!inQueue.compareAndSet(null, map)); // the main thread. (more than 10x faster than using map() in the same thread) MappedByteBuffer mbb = inQueue.getAndSet(null); 没有Thread.yield()我偶尔会在force(),put()和C的memcpy()中崩溃,这些都表示我试图非法访问内存。 使用Thread.yield()我没有遇到任何问题,但这听起来不是一个可靠的解决方案。 有人遇到过这个问题吗? 有关TLB和内存障碍的保证吗? 编辑:操作系统是Centos 5.7,我已经看到了i7和双Xeon机器上的行为。 我为什么这样做? 因为写入消息的平均时间是35-100 […]

分析JIT在volatile上下文中生成的x86输出

我正在写这篇文章与深入理解Java中的volatile有关 public class Main { private int x; private volatile int g; public void actor1(){ x = 1; g = 1; } public void actor2(){ put_on_screen_without_sync(g); put_on_screen_without_sync(x); } } 现在,我正在分析JIT为上面的代码生成了什么。 根据我在上一篇文章中的讨论,我们知道输出1, 0是不可能的,因为: 写入volatile v会导致v每个操作都会导致a在v可见之前可见(将被刷新到内存中)。 ……………..(I removed not important body of method)….. 0x00007f42307d9d5e: c7460c01000000 (1) mov dword ptr [rsi+0ch],1h ;*putfield x ; – package.Main::actor1@2 (line 14) […]