【问题标题】:Does the java model require hardware support for single modification order while the c++ model does not?java 模型是否需要对单个修改顺序的硬件支持,而 c++ 模型不需要?
【发布时间】:2014-04-01 23:09:02
【问题描述】:

java模型是否需要硬件支持单个修改顺序而c++模型不需要?

我写了一个有四个线程的程序 t0 设置 x = new .. t1 设置 x = new .. t2:读取 x 两次,t3 读取 x 两次 t2 和 t3 可以看到不同顺序的 x 变化吗?

在 c++11 中这是一场比赛(结果未定义) 在java中,这也是一场比赛,但对发生的事情有限制 对于许多 cpu 来说,有一个单一的修改顺序规则 - 使用硬件强制对 x 的更改仅次于所有观察者 - 如果硬件不支持并且 t2 是垃圾收集器 - java 是否提出任何要求?

【问题讨论】:

  • Java有自己的Memory Model,独立于底层操作系统和硬件。
  • Java 有自己的内存模型保证。但是,如果底层操作系统和硬件有更严格的保证,Java 往往会继承这些。这听起来可能是件好事,但实际上并非如此:这意味着如果您在更严格的硬件上进行编程,事情似乎可以正常工作,但是当您尝试在保证较少的硬件上运行程序时就会中断。

标签: java c++ memory-model


【解决方案1】:

在没有显式同步的情况下——同步块、锁、原子变量的使用——t2和t3可以看到Java和C++中不同顺序的变化。

【讨论】:

  • 这会带来安全漏洞吗?
  • 如果编程不当,是的。
  • @user2129444 是否会成为安全漏洞取决于具体情况。但是,程序员可以并且通常应该通过使用适当的显式同步来避免这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2020-03-05
  • 2019-11-27
相关资源
最近更新 更多