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

易失性读取发生在易失性写入之前吗?

公西财
2023-03-14
问题内容

我尝试了解为什么此示例是正确同步的程序:

a - volatile
Thread1:
x=a
Thread2:
a=5

由于存在冲突的访问(存在对a的写入和读取),因此在每个顺序一致性中,必须在访问之间的关系之前执行。假设顺序执行之一:

1. x=a
2. a=5

是1发生-在2之前发生,为什么?


问题答案:

不,在相同变量的易失性写入之前(以同步顺序),在易失性写入 之前 不一定 会发生 易失性读取。

这意味着它们可能处于“数据争用”中,因为它们“冲突的访问未按先发生后关系进行排序”。如果是这样,那么几乎所有程序都包含数据争用:)但这可能是规范错误。易失性读写不应该被视为数据竞争。如果程序中的所有变量都是易失性的,则所有执行在顺序上都是一致的。参见http://cs.oswego.edu/pipermail/concurrency-
interest/2012-January/008927.html



 类似资料:
  • 在阅读了这个问题和这个(尤其是第二个答案)之后,我对volatile及其关于记忆障碍的语义感到非常困惑。 在上面的例子中,我们写入一个易失性变量,这会导致一个mitch,这反过来会将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。 然而,非易失性字段可以优化并存储在寄存器中,例如?那么,我们如何才能确保给定一个写入易失性变量之前的所有状态变化都是可见的呢?如果我们有1000件东西呢

  • 我对下面的代码段有一个问题。结果可能有一个结果[0,1,0](这是用JCStress执行的测试)。那么这是怎么发生的呢?我认为数据写入(data=1)应该在Actor2(guard2=1)中写入到guard2之前执行。我说得对吗?我问,因为很多时候我读到挥发物周围的说明没有重新排序。此外,根据这一点:http://tutorials.jenkov.com/java-concurrency/vola

  • 问题内容: 我有一段代码看起来像这样: 片段A: 根据我的理解,由于的读取不同步,因此如果线程A 在下午1点创建了一个,而线程B 在下午2点进行了读取,则很可能返回0或1(即使线程A在1.05 pm完成了对对象的初始化) )。 所以我添加到: 片段B: 一切都很好,除了我在想,如果我将其修改为 Snippet C ,变量是否仍正确同步? 片段C: 使用 代码片段C ,是否可以保证线程A在下午1:0

  • 我已经阅读了许多相互矛盾的信息(msdn,SO等),关于易失性和VoletleRead(ReadAcquireFence)。 我理解这些限制的内存访问重新排序含义——我仍然完全搞不清楚的是新鲜度保证——这对我来说非常重要。 msdn doc用于挥发性提及: (…)这样可以确保字段中始终存在最新的值。 挥发性字段的msdn文档提到: 对易失性字段的读取称为易失性读取。易失性读取具有“获取语义”;也就

  • 它几乎是线程安全的单例的正确实现。我看到的唯一问题是: 初始化字段的可以在完全初始化之前发布。现在,第二个线程可以在不一致的状态下读取。 但是,在我看来,这只是问题。这是唯一的问题吗?(并且我们可以使不稳定)。

  • 我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在