gpt4 book ai didi

Java:通过同步实现公共(public)实例变量线程安全

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

如果我有这个:

public class Foo {
public int bar;

public Foo(int bar) {
this.bar = bar;

synchronized (Foo.class) {
Foo.instance = this;
Foo.class.notify();
}
}

public static Foo instance;

public static Foo instance() {
synchronized (Foo.class) {
if (Foo.instance == null) {
Foo.class.wait();
}

return instance;
}
}
}

在另一个类中,假设我还没有以任何方式改变 Bar 的值,我在未来的任何和所有未指定的点都有这个:

int baz = Foo.instance().bar;

是否有可能拥有 Foo 。实例 ( ) 。 Bar 返回未初始化的乱码?我的想法是,由于我已经保证在设置 Instance 变量之前没有任何东西会尝试访问 Bar,JIT 编译器无法优化任何内容并且必须从主内存中读取,但这是真的吗? ?它是否有可能以某种方式进行编译,以便它改为提取 0 (这是在构造函数中设置为新值之前 Bar 的值)。

最佳答案

实现单例的方法有很多种——这是我见过的最奇怪的一种。如果它不是单例 - 请注意该类的两个实例不能同时使用。

如果您只使用此类的一个实例,则在这种情况下只有变量 Bar 被声明为 volatile 时,它不会返回任何乱码。否则可能会发生奇怪的事情,例如返回 0。

关于Java:通过同步实现公共(public)实例变量线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081628/

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