gpt4 book ai didi

Java 多线程 getter 和 setter

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

假设我有一个实例变量,并且有 setter 和 getter。

代码1:

Class<T> {
volatile T value;

public synchronized void set(T v) {
if(value==null) {
value=v;
}

}

public T get() {
return value;
}
}

代码2:

Class<T> {
static volatile T value;

public synchronized void set(T v) {
if(value==null) {
value=v;
}
}

public T get() {
return value;
}
}

我有两个问题

1)具有静态 volatile 状态字段和仅 volatile 状态字段有什么区别?

2)我刚刚了解了 volatile 读/写的release/acquire概念,并且了解到不需要同步getter(因为缓存刷新)。但是是否需要同步setter?

最佳答案

让我们从第二个问题开始:

我认为您应该在 setter 中使用同步块(synchronized block)的原因是您对执行两种不同的操作。您检查value==null,然后设置value=v。虽然您在每个步骤中都有锁,但它们之间却没有锁。所以这是可能的:

Thread1: lock value -> value==null (true) -> release value
Thread2: lock value -> value==null (true) -> release value
Thread1: lock value -> value=v -> release value;
Thread2: lock value -> value=v -> release value;

所以你仍然有竞争条件。

现在回到你的第一个问题:你应该使用 static 来让类的任何实例使用相同的变量 T,而不是拥有自己的变量。

关于Java 多线程 getter 和 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24780096/

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