gpt4 book ai didi

Java volatile 关键字

转载 作者:行者123 更新时间:2023-11-30 08:07:31 25 4
gpt4 key购买 nike

我知道有很多关于 volatile 的问题,但我对这个讨论感到困惑: Java: how volatile guarantee visibility of "data" in this piece of code?

我读过的每个网站都说变量可以存储在缓存中(使这个值对另一个线程不可见)我什至找到了这个例子 https://dzone.com/articles/java-volatile-keyword-0

所以我的第一个问题是:Java 是否将变量值存储在高速缓存中(在哪一个?l1 l2 或 l3)

我的另一个问题是可见性部分。例如:

public int num1 = 1;
public int num2 = 2;
public int num3 = 3;
public int num4 = 4;
public int num5 = 5;
...
num1 = 10;
num2 = 20;
num3 = 30;
num4 = 40;
num5 = 50;

在此示例中,变量的执行顺序无法保证。如果我将 num2 设置为 volatile,它会向我保证 num1、num2 和 num3 的执行顺序将完全与其定义的一样,但它不能向我保证 num4 和 num5 的执行顺序?

编辑我刚读完彼得劳瑞的文章 http://vanillajava.blogspot.com.es/2012/01/demonstrating-when-volatile-is-required.html他写道:“如果没有 volatile,这会以多种可能的方式分解。一种方式是两个线程各自认为它们已经更改了值并正在等待另一个,即 每个线程都有自己的缓存值副本.

Sooo 我更加困惑了..

很抱歉这个问题可能很愚蠢,但我真的很困惑。

最佳答案

大多数程序,包括 JVM 都不会明确地将变量放入任何特定的缓存中。 JIT 做出的唯一决定是

  • 它是否完全消除了变量?
  • 它会把它放在寄存器中吗?是哪个寄存器?
  • 它是否将它放在内存中的堆栈上? (以及相对于堆栈顶部的位置)
  • 它是否将它放在堆上的一个对象中? (以及对象中的位置)

您唯一的选择是变量是在对象中还是在堆栈中。 (您也可以选择完全避免使用变量)请注意,如果您将字段放在一个对象中,如果 jit 可以避免创建该对象,它仍然可以将它仅放在堆栈中。

使 num2 可变的唯一可见性保证是,如果你看到 num2 == 20,你必须看到 num1 == 10。你也保证你会在某个时候看到 num2 == 20在其他线程中。您可能会看到 num3 == 3 或 num3 == 30。您可能永远不会在另一个线程中看到 num3,因为它不是 volatile 或 final。如果您在第二次写入 num2 之前在另一个线程中读取该字段,您可能会看到 num3 == 0,这是未初始化的值。

each has its own cached copy of the value.

这不是由 Java 决定的,而是 CPU 的实现细节。在 x64、Sparc 和 ARM 中,每个内核都有自己的 L1 和 L2 缓存。这些缓存对于每个内核都是本地的以提高速度,这意味着它们可能彼此不同步。确保它们始终同步会大大降低它们的速度。

关于Java volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643800/

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