gpt4 book ai didi

multithreading - 什么时候不使用 volatile?

转载 作者:行者123 更新时间:2023-12-04 04:25:33 25 4
gpt4 key购买 nike

是否存在我们不会将 volatile 用作线程间共享对象的类成员的情况?我的理解是 volatile 关键字确保对象值不被线程缓存而是始终从内存中读取,但不将其标记为 volatile 并不意味着它将始终被线程缓存。所以我的问题是,我们是否可以通过不将此类标记为 volatile 来保证任何事情,或者代码是否会对随机行为开放?

编辑:我知道对所有内容使用 volatile 并不能保证我的逻辑的正确性。我的问题更多是理论性质的,是我试图理解 Java 内存模型。

最佳答案

首先你不应该用缓存来解释并发。由于版本 2 java 内存模型更正式并且要求更弱。所以,这完全是关于先发生后发生的顺序。

如果您需要并发访问某些变量,您必须按 happens-before 对写入和读取进行排序。这是最重要的事情。 Volatile 只是这种排序的一种实现方式。

因此,除了 volatile 之外,您还可以使用任何具有 happens-before 语义的操作。来自 JLS :

  • 监视器上的解锁发生在监视器上的每个后续锁定之前监控。

  • 线程中对 start() 的调用发生在线程中的任何操作之前开始线程。

  • 线程中的所有操作先于任何其他线程成功
    从该线程上的 join() 返回。

  • 任何对象的默认初始化发生在任何其他对象之前
    程序的操作(默认写入除外)。

关于multithreading - 什么时候不使用 volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27027974/

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