В соответствии с этим post, класс одноэлементного потока должен выглядеть так, как показано ниже. Но мне интересно, нужно ли добавить ключевое слово volatile
в переменную static CrunchifySingleton instance
. Поскольку, если экземпляр создан и хранится в кэше CPU, в это время он не записывается обратно в основную память, между тем другой поток вызывает метод getInstance()
. Возникает ли проблема непоследовательности?Нужно ли добавлять ключевое слово volatile, чтобы гарантировать потокобезопасный класс singleton в java?
public class CrunchifySingleton {
private static CrunchifySingleton instance = null;
protected CrunchifySingleton() {
}
// Lazy Initialization
public static CrunchifySingleton getInstance() {
if (instance == null) {
synchronized (CrunchifySingleton.class) {
if (instance == null) {
instance = new CrunchifySingleton();
}
}
}
return instance;
}
}
Lazy initialized Singletons - это отходы; Синглтоны в целом - плохая идея.Google написали программное обеспечение, чтобы идентифицировать их для удаления из своего кода. Почему вы их используете? – duffymo