gpt4 book ai didi

java - JCIP SafePoint - 它真的是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-01 20:09:49 26 4
gpt4 key购买 nike

Brian Goetz 等人在 Java Concurrency in Practice 中提供了以下示例(缩短了 list 4.11)。

public class SafePoint {
private int x, y;
public SafePoint(int x, int y) {
this.x = x;
this.y = y;
}

public synchronized int[] get() {
return new int[] { x, y };
}

public synchronized void set(int x, int y) {
this.x = x;
this.y = y;
}

}

它真的是线程安全的吗? x 和 y 既不是 volatile 的也不是最终的,并且它们的设置没有锁定,这意味着调用 get() 的另一个线程可能会看到陈旧的值(零)。我在这里错过了什么吗?

最佳答案

Is it really thread-safe?

是的。

x and y are neither volatile nor final,

正确,但是......

and they are set without locking on this

不正确。 get 和 set 方法是同步方法,这意味着它们隐式锁定并同步this

<小时/>

实际上......对此有一个警告。在创建 SafePoint 实例和(第一个)getset 之间,还必须有一个发生在之前调用其他线程。如果没有,则 getset 可能会看到 xy 的默认值code> 而不是传递给构造函数的值。

Goetz 等人在 Java 并发实践的下一页中介绍了这一点......尽管他们使用比 hb 关系更高级别的推理。在 list 4.12 中,他们使用 ConcurrentHashMap 来确保 SafePoint 安全发布。

关于java - JCIP SafePoint - 它真的是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827407/

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