gpt4 book ai didi

java - 什么时候引用需要是原子的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:48 24 4
gpt4 key购买 nike

在 Java 中以原子方式分配引用是什么意思?

  • 我确实理解 long 和 double 的含义,即:线程可以看到部分构造的数字,
  • 但是对于一个我不理解的对象,因为赋值并不意味着复制只是指向内存中的地址

那么,如果引用分配在 Java 中不是原子的,那会出现什么问题呢?

最佳答案

这意味着您永远不会得到损坏的引用。假设您有以下类(class):

class MyClass {
Object obj = null;
}

在内存中obj是一个空指针,一般是0x00000000这样的整数。然后假设在一个线程中你有一个任务:

this.obj = new Object();

假设 new Object() 被分配在内存中,并且有像 0x12345678 这样的指针。引用原子性确保当您从另一个线程检查 obj 时,您将有一个空指针(0x00000000)或指向新对象的指针(0x12345678)。但在任何情况下,您都无法获得指向任何地方的部分分配的引用(如 0x12340000)。

这可能看起来很明显,但这种问题可能会出现在低级语言中,如 C,具体取决于 CPU 架构和内存对齐方式。例如,如果您的指针未对齐并越过缓存行,则可能无法同步更新。为了避免这种情况,Java 虚拟机总是对齐指针,因此它们永远不会越过缓存行。

如果 Java 引用是非原子的,那么当取消引用从另一个线程写入的引用时,您可能会得到不是在赋值之前或之后引用的对象,而是随机内存位置(这可能导致段错误、损坏的堆或任何其他灾难)。

关于java - 什么时候引用需要是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31042696/

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