我最近偶然发现了一段类似于下面的代码。此代码确实很臭。看起来像单例,但不是因为没有私有构造函数。我知道这肯定会给线程安全问题带来足够大的负担。特殊给出的类实例。有人可以指出此代码的线程安全问题吗?
public class AClass extends AnotherClass {
public static final AClass instance = new AClass();
public static SomeObject doSomethingThatCallsAService(Params params) {
return methodThatCallsService(params, instance);
}
public static SomeObject methodThatCallsService(Params params, AClass instance) {
-----call service here ---------
instance.doSomethingElse();
}
private void doSomethingElse() {
--- do some trivial work -----
}
}
答案 0 :(得分:3)
鉴于该对象不携带状态,因此与线程安全无关,无论在单例对象上调用方法或对单例对象进行引用的线程数量如何。
该类中的所有方法,包括静态方法,都不使用任何共享数据。因此,无论他们是在单例对象上调用方法还是在实例之间传递实例,都无需访问任何要同步的东西。
正如代码所示,唯一可能需要同步的数据是import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.Response;
的参数中的params
,并且只有此方法修改了数据并且线程持有对同一methodThatCallsService
对象的引用。
但是就此类而言,即使单例实现很容易受到攻击,它也是线程安全的。