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

Java和C#中的可变语义背后的原因是什么

洪高阳
2023-03-14
问题内容

C#和Java都定义
易失性读取具有获取语义

易失性写入具有释放语义

我的问题是:

这是定义volatile的唯一正确方法。
如果没有,如果语义相反,情况会完全不同,即
易失性读取具有释放语义
易失性写入具有语义


问题答案:


获取/释放语义的作用并不在于其他线程多久才能看到volatile字段本身的新写入的值,而在于易失性操作在不同线程之间建立事前联系的方式。如果线程A读取了一个volatile字段并在另一个线程B中看到了写入该字段的值,那么线程A也将保证在线程B执行该操作之前,线程A会看到线程B写入其他变量(不一定是volatile)的值。易失性写入。这看起来像是缓存刷新,但仅 从读取volatile的线程的角度来看,其他未触及volatile字段的线程对B没有排序保证,并且可能会看到一些较早的非易失性写入,但是如果编译器/ JIT则看不到其他很倾斜

监视器获取/发布的类似特征是它们引起的事前关联-监视器释放之前一个线程的动作可以保证在另一个线程随后获取同一监视器之后可见。Volatiles为您提供与监视器同步相同的顺序保证,但没有阻塞。

 类似资料:
  • 这里已经阐明了和之间的区别。 但我的问题是,为什么我们要使用关键字?从生成的Java代码角度来看没有区别。 静态编程语言代码: 生成:

  • 问题内容: 在Java中,可以使用 AtomicMarkableReference 原子地更新对象引用以及标记位。 该javadoc的状态: 实施注意事项:此实现通过创建表示“装箱的” [reference,boolean]对的内部对象来维护可标记的引用。 根据在该类的Java 8源代码中可以看到的情况,这是正确的: 该类的get方法的设计背后是否有原因? 使用这种布尔数组(而不是返回值对)有什么

  • 我对编程很陌生,我已经自学了将近一个月了,有谁能给我解释一下我代码中错误的原因吗?在“Total(moneyConv(moneySum*moneyRate))”中出错。行,表示实际和形式的论点在长度上是不同的。我检查了我所有的参数,我觉得很好。多谢!

  • 问题内容: 接口隔离原理(ISP)说,许多客户端特定的接口比一个通用接口好。为什么这很重要? 问题答案: ISP指出: 不应强迫客户依赖他们不使用的方法。 ISP与重要特性- 内聚和耦合有关。 理想情况下,您的组件必须高度定制。它提高了代码的健壮性和可维护性。 实施ISP可为您带来以下好处: 高内聚性 -更好的易懂性,鲁棒性 低耦合 -更好的可维护性,高抗变化性 如果您想了解有关软件设计原理的更多

  • 问题内容: 我看过一些D3代码,它们带有类似这样的模式,用于附加元素: 我真的不明白这个片段。为什么选择null?我对D3的理解方式是,如果要添加圆,则应为: 同样,如果要追加HTML段落,则应该为: 类也是如此:如果将元素添加到类中foo,则应该为。 但是, 确实有效!元素被追加。那么,这是什么意思null呢?我在这里想念什么? 注意:这是一个自我回答的问题,试图提供一个针对该主题的“规范”问答

  • 问题内容: 最近,我通过Crockford的JSLint运行了一些JavaScript代码,它给出了以下错误: 第1行第1个字符处的问题:缺少“使用严格”语句。 通过搜索,我意识到有些人将其代码添加到了JavaScript中。添加语句后,错误停止出现。不幸的是,谷歌没有透露此字符串语句背后的许多历史。当然,它一定与浏览器如何解释JavaScript有关,但是我不知道会有什么影响。 那么到底是什么,