我有一个问题Singleton模式和线程。实施就是这样。
public class Singleton {
private static final Singleton instance = new Singleton();
private SomeClass someField;
// and another private fields
private Singleton() {
someField = new SomeClass(some args);
// init another private fields
}
public Singleton getInstance() {
return instance;
}
public void operation() {
//some operations
someField.method();
}
}
(抱歉,我无法提供真实的例子。) 接下来的问题是:方法操作()线程安全吗?
答案 0 :(得分:5)
我们不知道它是否安全 - 我们不知道someField.method()
是做什么的。
我强烈建议您someField
final
字段,好像单例需要改变状态,然后肯定不是线程安全的,没有额外的同步。如果SomeClass
本身是不可变的并且是线程安全的,那么你不应该需要任何其他的同步 - 但是否则,你将会这样做。
基本上,关于单身人士并没有什么“神奇的线程安全”。它只是一个单个实例,多个线程可以通过静态getInstance()
方法访问它。如果该类是线程安全的,那么它是线程安全的,无论它是否是单例 - 如果它不是线程安全的,那么将它作为单例也不会有任何帮助。
答案 1 :(得分:3)
someField.method();
的线程安全性取决于它实际上在做什么。如果它正在修改多个线程之间共享的状态,那么它就不是线程安全的。如果没有,它可能是线程安全的。但总的来说,不应该假设它是线程安全的。没有代码,我不能说更多。
答案 2 :(得分:0)
如上所述,答案不是线程安全的。 这可以作为下面的代码进行测试!
public class TestSingleton {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(10);
for (int j = 0; j < 100000; j++) {
pool.submit(new Thread() {
public void run() {
Singleton.get().add();
}
});
}
pool.shutdownNow();
System.out.println(Singleton.get().getcnt());
}
}
class Singleton {
private static Singleton singleton = new Singleton();
int cnt = 0;
private Singleton() {}
public static Singleton get() {
return singleton;
}
public void add() {
cnt++;
}
public int getcnt() {
return cnt;
}
}