gpt4 book ai didi

java - 易变的背负式。这足以提高知名度吗?

转载 作者:IT老高 更新时间:2023-10-28 20:40:12 26 4
gpt4 key购买 nike

这是关于不稳定的搭载。目的:我想达到一个轻量级的变量可见性。 a_b_c 的一致性并不重要。我有一堆 var,我不想让它们都不稳定。

这段代码是线程安全的吗?

class A {
public int a, b, c;
volatile int sync;

public void setup() {
a = 2;
b = 3;
c = 4;
}

public void sync() {
sync++;
}
}

final static A aaa = new A();

Thread0:
aaa.setup();
end

Thread1:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}

Thread2:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}

最佳答案

Java 内存模型定义了 happens-before 关系,它具有以下属性(以及其他属性):

  • “线程中的每个 Action 都发生在该线程中按程序顺序后面的每个 Action 之前”(程序顺序规则)
  • “对 volatile 字段的写入发生在每次后续读取同一 volatile 之前”(volatile 变量规则)

这两个属性连同 happens-before 关系的传递性暗示了 OP 以下列方式寻求的可见性保证:

  1. 写信给 a在线程 1 中发生之前写入 sync调用sync()在线程 1 中(程序顺序规则)。
  2. 写信给 sync调用sync()在线程 1 中发生之前读取到 sync调用sync在线程 2( volatile 变量规则)中。
  3. 来自 sync 的阅读调用sync()在线程 2 happens-before 中读取 a在线程 2 中(程序顺序规则)。

这意味着问题的答案是肯定的,即调用 sync()在线程 1 和 2 的每次迭代中确保对 a 的更改可见, bc到其他线程。请注意,这仅确保可见性。不存在互斥保证,因此所有不变量都绑定(bind) a , bc可能会被违反。

另见 Java theory and practice: Fixing the Java Memory Model, Part 2 .特别是“波动的新保证”部分,它说

Under the new memory model, when thread A writes to a volatile variable V, and thread B reads from V, any variable values that were visible to A at the time that V was written are guaranteed now to be visible to B.

关于java - 易变的背负式。这足以提高知名度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769570/

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