Как цитируется @irreputable, volatile не дорогая. Даже если это дорого, согласованность должна быть отдана приоритету над производительностью.
Есть еще один чистый элегантный способ для Lazy Singletons.
public final class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
Исходная статья: Инициализация-по-запросу_holder_idiom из википедии
В программной инженерии идиома Инициализация по требованию (шаблон дизайна) - это ленивый загруженный синглтон. Во всех версиях Java идиома обеспечивает безопасную, очень параллельную ленивую инициализацию с хорошей производительностью
. Поскольку у класса нет инициализируемых переменных static
, инициализация завершается тривиально.
Определение статического класса LazyHolder
внутри него не инициализируется до тех пор, пока JVM не определит, что LazyHolder должен быть выполнен.
Статический класс LazyHolder
выполняется только тогда, когда статический метод getInstance
вызывается в классе Singleton, и в первый раз это произойдет, JVM будет загружать и инициализировать класс LazyHolder
.
Это решение является потокобезопасным, не требуя специальных языковых конструкций (т.е. volatile
или synchronized
).
Конвертируйте свою cDate в Java Date, а затем в String.
Заменить cDate
в запросе на:
dateFormatter.format(cDate.toJavaDate())