Java 单例方法线程安全

Java 单例方法线程安全,java,multithreading,design-patterns,singleton,Java,Multithreading,Design Patterns,Singleton,我有一个关于单例模式和线程的问题。实现是这样的 public class Singleton { private static final Singleton instance = new Singleton(); private SomeClass someField; // and another private fields private Singleton() { someField = new SomeClass(some arg

我有一个关于单例模式和线程的问题。实现是这样的

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();
    }
}
(很抱歉,我不能提供真实的例子。)
接下来的问题是:method operation()线程安全吗?

我们不知道它是否安全-我们不知道someField.method()的作用

我强烈建议您将
someField
设置为
final
字段,就好像单例需要改变状态一样,如果没有额外的同步,那么它肯定不是线程安全的。如果
SomeClass
本身是不可变的,并且是线程安全的,那么您不需要任何其他的同步,否则,您将需要


基本上,单身没有什么“神奇的线程安全”。它只是一个实例,多个线程可以通过静态
getInstance()
方法访问该实例。如果类是线程安全的,那么不管它是否是单实例,它都是线程安全的——如果它不是线程安全的,那么将其设置为单实例将无助于此。

someField.method()的线程安全性取决于它实际在做什么。如果它正在修改多个线程之间共享的状态,那么它就不是线程安全的。如果不是,它可能是线程安全的。但一般来说,不应假定它是线程安全的。如果没有代码,我不能说更多。

答案并不像上面回答的那样是线程安全的。 这可以按照下面的代码进行测试


}

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