单例方法线程安全

时间:2012-09-08 14:44:21

标签: java multithreading design-patterns singleton

我有一个问题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();
    }
}

(抱歉,我无法提供真实的例子。) 接下来的问题是:方法操作()线程安全吗?

3 个答案:

答案 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;
}

}