java - 帮忙看看下面的代码,是线程安全的吗?

标签 java multithreading static-methods

private static Callback callback;

public Foo()
{
    super(getCallback());
}

private static Callback getCallback()
{
    callback = new Callback();
    return callback;
}

Constructor Foo() 可能会被多个线程调用。我关心的是私有(private)静态字段“回调”和静态方法“getCallback()”。

可以看出,每次调用“getCallback()”时,它都会为静态字段“callback”分配一个新值。

我的猜测是它不是线程安全的,因为关键字static总是附加到类而不是实例,所以这意味着静态字段'callback' Foo 的函数可能会被正在构造另一个 Foo() 的其他线程覆盖。这是正确的吗?

如有错误请指正。谢谢!

编辑:我的目的是将“回调”保留在类(class)的某个地方,以便我以后可以重用它。但这并不容易,因为 Foo 扩展自一个类,该类具有强制传递“回调”的构造函数。

最佳答案

是的,你是对的。当两个线程同时进入 getCallback() 方法并且其中一个分配一个new CallBack 到静态字段,而另一个已经完成但尚未返回。在这种情况下,最好的解决方法是不要使用静态字段,因为它毫无用处。或者,使 getCallback() 同步。

但请注意,只有 static 关键字导致代码不是线程安全的,这是真的。

关于java - 帮忙看看下面的代码,是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/934130/

相关文章:

java - log4j 记录器类名通配符

java - J2ME 是否支持 HTTP PUT?

c++ - 在 C/C++ 和 std::array 中使用 TCP 时避免阻塞程序

python - 如何在 Python 中使用类变量作为默认参数值

Java NumberFormatException?

java - 在 Java 中运行外部程序

javascript - 在工作线程之间共享负载的最佳方式

c++ - 多线程处理,同时保持部分顺序

java - Java 线程安全适用于类的所有实例还是仅适用于共享实例?

c++ - 如何调用另一个类的静态方法