请考虑以下事项:
public class Singleton {
private static Singleton instance;
// NO INSTANCE VARIABLES
private Singleton() {
super(); // Just to have something to write here.
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public String parseSomething(MyObject myObject) {
// Do stuff
}
public void doAnotherThing(String value) {
// Do something else
}
}
parseSomething()
和doAnotherThing()
线程安全吗?换句话说,如果我有多个线程获取Singleton
实例并且可能同时调用这两个方法,它会终止生命吗?
我的直觉(和有限的经验)说“不”,因为这些方法不会对其范围之外的任何事情采取行动;它们不会在Singleton
中的任何实例变量中携带状态。每个调用线程都有自己的堆栈中的参数和本地范围的变量,所以(理论上)它们不应该碰撞。
不幸的是,我似乎无法向Google提出有关此主题的任何问题不涉及Singleton
中的状态承载实例变量上的实例方法的某些操作。
修改:再次尝试instance
。不过,我真正的问题是,假设N个线程在instance
上有句柄,并且正在调用parseSomething()
和doAnotherThing()
,他们会互相谋杀吗?
答案 0 :(得分:0)
parseSomething()和doAnotherThing()是否是线程安全的?
高度依赖于他们做什么以及他们如何做,单例模式,与线程安全无关,它应该保证在该对象中只有一个实例运行系统,顺便说一下这个实现没有(你可以创建另一个Singleton实例,使用反射,或者如果在getInstance调用中并行调用getInstance)。
因此,如果此方法是无状态的,并且没有任何共享状态,那么它们是线程安全的。你可以在单例类中使这些方法保持静态,并从这个Singleton中创建一个实用程序类。