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/