gpt4 book ai didi

java - Java 中的多个 volatile 字段性能与同步块(synchronized block)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:19 26 4
gpt4 key购买 nike

最新InfoQ eMag我遇到了一句话:

Declaring any field as “volatile” doesn’t mean that locking is involved, so volatiles are less expensive than synchronizations that use locks. But it’s important to note that having multiple voatile fields inside your methods
could make them more expen- sive than locking those methods.

令我困扰的是第二部分:

But it’s important to note that having multiple voatile fields inside your methods
could make them more expensive than locking those methods

根据 The JSR-133 cookbook volatile load 与 monitor enter 具有相同的内存效应,所以第二句话怎么可能是真的?

最佳答案

访问 volatile 字段具有三种效果:

  1. VM 要求程序遵守周围变量的同步顺序(与synchronized 关键字不同)。
  2. 访问 volatile 字段的线程需要将其缓存与访问该 volatile 字段的其他线程同步。
  3. 对于 longdouble 类型,访问变量访问必须是原子的(在 64 位架构上,无论如何都会发生这种情况)。

进入/离开一个synchronized block 只有效果(1)和(2),而如果是longdouble 则原子访问是隐式的字段只能在这样的 block 中访问。此外,当然,同步块(synchronized block)意味着锁定监视器。

have given talks on the details of these effects如果您想了解更多信息,请多次使用。它太复杂了,无法在 Stack Overflow 上完整介绍。

在实践中,大多数 VM 都超出了这些要求。例如,HotSpot VM 接近 JMM-cookbook 的建议,并在访问 volatile 变量后发出内存屏障。在添加 synchronized block 之前和之后添加了类似的内存屏障。

因此,如果访问 N 个 volatile 字段的开销超过两个这样的内存屏障加上获取互斥体的开销,则上述状态可以变为真> 从互斥体中访问 N 个可变字段的位置。我怀疑在单个同步块(synchronized block)变得更高效之前,人们是否可以就需要访问多少变量做出有意义的陈述。 VM 在优化方面非常聪明,例如可以批量内存刷新,或者它可以在另一方面删除互斥锁的请求。我总是会尝试表达语义上更正确的东西;针对规范的代码,而不是实现。如果您选择后者,请务必对您的结果进行适当的基准测试,甚至在此之前,请确保您确实需要挤出那一点性能。

关于java - Java 中的多个 volatile 字段性能与同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com