当前位置: 首页 > 面试题库 >

是对Java中的volatile的内存屏障写操作

阙阳夏
2023-03-14
问题内容

我最近在一次演讲中听说,对volatile的写操作会为线程已写入的每个变量触发内存屏障。真的对吗?从JLS看来,似乎只有相关的变量被清除了,而其他变量则没有。有人知道什么是正确的吗?能否给我指出JLS中的具体位置?


问题答案:

对挥发性变量和其他变量的引用是正确的。我没有意识到,before-
before的可传递性是VM必须实现的,而不是从定义中得出的。我仍然感到困惑,为什么并没有明确说明具有如此深远影响的事物,而实际上却是某些定义的必然结果。总结一下:假设您有以下4种操作:

thread1        thread2
a1
a2
                a3
                a4

其中a2是对易失性变量v的写操作,而a3是对同一个易失性变量v的读操作。根据对事件的定义-(hb)分别是hb(a1,a2)和hb(a3,a4)。另外,对于挥发物,我们有hb(a2,a3)。现在从所需的hb传递性得出hb(a1,a3)。因此,易失性变量v的写入和后续读取将充当存储屏障。



 类似资料:
  • 问题内容: 最近,我正在阅读一些Linux内核空间代码,我看到了 该代码段的语义是什么?是否确保#1在#3之前由#2执行。但是我有点乱,因为 #A 在64位平台上,atomic64_read宏扩展为 在32位平台中,将其转换为使用锁 cmpxchg8b 。我认为这两个具有相同的语义,对于64位版本,我认为这意味着: all-or-nothing ,我们可以排除地址未对齐且字长大于CPU本机字长的情

  • 我正试图确切地理解什么是记忆障碍。根据我目前所知,使用内存屏障(例如:mfence)来防止指令从之前到之后和从之后到之前的重新排序。 这是正在使用的内存屏障的一个示例: 现在我的问题是:mfence指令是否只是一个指示CPU以何种顺序执行指令的标记?或者,它是CPU实际执行的指令,就像它执行其他指令一样(例如:)。

  • 我在一个并发编程课上有一个考试。这门课结构相当好,但我觉得我对“易失性”关键词的理解一定没有我想象的那么好。我已经通读了其他关于它是如何工作的帖子,这似乎是有意义的,但是我对Java整体的理解限制了我。这些是练习题,有人介意回答它们并解释为什么它们是真的或假的吗?我已经把我最好的猜测和解释 A.____Anint变量计数在几个线程之间共享,其中计数的唯一操作是读取其值并将其递增。将计数标记为易挥发

  • 我试图理解java volatile的本质及其语义,以及它对底层架构和指令的转换。如果我们考虑以下博客和资源 生成的栅栏的易失性,什么得到生成的读/写的易失性和堆栈溢出问题上的栅栏 以下是我收集的信息: volatile read在其后面插入loadStore/LoadLoad屏障(x86上的LFENCE指令) 它可以防止在后续写入/加载时对加载进行重新排序 它应该保证加载由其他线程修改的全局状态

  • 问题内容: 在linux代码中,我记得听说过mutex_lock()周围有完整的内存屏障。我想确定它是否也在sem_xxx附近。 问题答案: 是的,在无竞争的情况下,它使用原子递增/递减,这当然有一个小数。对于有争议的情况,有一个对futex的系统调用,它也有一个成员。

  • 本文向大家介绍讲一下volatile涉及的Java内存模型?相关面试题,主要包含被问及讲一下volatile涉及的Java内存模型?时的应答技巧和注意事项,需要的朋友参考一下 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可