Ржевский Дмитрий Rzhevskiy Dmitry
среда сен 16, 2009
Singleton и AtomicReference
Сегодня в интернете обнаружил прикольную вещь
классический Singleton
public final class Singleton {
private static Singleton _instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
В комментах к статье http://www.javenue.info/post/2 Более новую и быструю реализацию через AtomicReference
public class Singleton {
private static final AtomicReference SINGL_REF = new AtomicReference();
private Singleton() {
}
public static final Singleton getInstance() {
if (SINGL_REF.get() == null) {
SINGL_REF.compareAndSet(null, new Singleton());
}
return SINGL_REF.get();
}
}
Posted at 01:07PM сен 16, 2009 by Дима in Java | Комментарии[5]


if (SINGL_REF.get() == null)
а зачем вот ета проверка нужна ?
типа эта штука
SINGL_REF.compareAndSet(null, new Singleton());
если там нулл, то установит новый а если не нулл, ничо не будет делать..
мне так кажется..
опубликовал a2ego Сентябрь 16, 2009 at 11:06 PM MSD #
у меня предположение что это для перфоманса
опубликовал Дима Сентябрь 17, 2009 at 01:07 AM MSD #
А ещё прикольная реализация есть для AspectJ.
Вся функциональность выносится в отдельный аспект. Класс который ты хочешь сделать синглтоном помечаешь аннотацией @Singleton и всё.
http://www.christianschenk.org/blog/singletons-with-aspectj/
опубликовал Дима Сентябрь 17, 2009 at 01:21 AM MSD #
А еще есть Spring по умолчанию singleton="true"
опубликовал maxm165 Сентябрь 17, 2009 at 10:47 PM MSD #
maxm165, в спринге синглтон - не настоящий синглтон а только а уровне контекста. А контекстов создать можно много.
Ну а то что ты мне jabber написал - верно: Вражение if (SINGL_REF.get() == null) здесь совершенно обязательно - иначе н каждый вызов getInstance создавался новый инстанс снглтона и удалялся сборщиком мусора.
И в текущей реализации есть вероятность что во время инициализации будет существоваь несклько инстансов синглтона.
опубликовал Дима Сентябрь 18, 2009 at 12:55 AM MSD #