Разное

Что такое синглтон: Singleton (Одиночка) или статический класс? / Хабр

Содержание

Реализация Singleton в JAVA / Хабр

В этой статье я хочу затронуть тему одного из наиболее распространенных паттернов объектно-ориентированного программирования – Singleton. Но в данном случае я не буду описывать преимущества/недостатки и области применения этого паттерна, а попытаюсь изложить свой взгляд на его имплементацию в JAVA.

Общие сведения

Паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

Область применения

1.) В системе должно существовать не более одного экземпляра заданного класса.

2.) Экземпляр должен быть легко доступен для всех клиентов данного класса.

3.) Создание объекта on demand, то есть, когда он понадобится первый раз, а не во время инициализации системы.

Реализация (JAVA):

На данный момент существуют несколько вариантов реализации со своими недостатками и преимуществами. В них мы и попробуем сейчас разобраться.

Вариант первый – самый простой, который приходит в голову сразу после понимания проблемы.

У этого решения есть единственный недостаток – оно не работает в многопоточной среде и поэтому не подходит в большинстве случаев. Решение подходит исключительно для однопоточных приложений.

Не беда, скажите вы, и предложите следующее решение.

Вариант второй:

И вы будете правы, так как проблему многопоточности мы решили, но потеряли две важные вещи:

1. Ленивую инициализацию (Объект instance будет создан classloader-ом во время инициализации класса)

2. Отсутствует возможность обработки исключительных ситуаций(exceptions) во время вызова конструктора.

Решение подходит для многопоточных приложений, при условии отсутствия опасности возникновения исключительных ситуаций в конструкторе и отсутствии необходимости ленивой инициализации.

Далее возникают 2 варианта решения.

1.) Использование внутреннего класса(решение Била Пью(Bill Pugh) “Initialization on Demand Holder”).

2.) Использование синхронизации.

Начнем с Била Пью.

Вариант третий:

“Initialization on Demand Holder”

В данном случае мы полностью решили проблему ленивой инициализации – объект инициализируется при первом вызове метода getInstance(). Но у нас осталась проблема с обработкой исключительных ситуаций в конструкторе. Так что, если конструктор класса не вызывает опасений создания исключительных ситуаций, то смело можно использовать этот метод.

Синхронизация

Этой части я хотел бы уделить особое внимание. Можно было бы подойти к данному вопросу с заголовком «synchronized – мифы и реальность».

И так, самый прямолинейный метод.

Вариант четвертый:


У этого варианта есть только один недостаток. Синхронизация полезна только один раз, при первом обращении к getInstance(), после этого каждый раз, при обращении этому методу, синхронизация просто забирает время. Что можно сказать по этому поводу? Ну, во-первых, если вызов getInstance() не происходит достаточно часто (что значит «достаточно часто» решать вам), то этот метод имеет преимущество перед остальными – прост, понятен, лениво инициализируется, дает возможность обрабатывать исключительные ситуации в конструкторе. А во-вторых, синхронизация в Java перестала быть обременительно медленной настолько, насколько ее боятся. Ну что еще для счастья надо?

Теперь рассмотрим вариант синхронизированного решения, в котором попытаемся решить проблему, возникшую в предыдущем варианте.

Наиболее распространенный способ — «Double-Checked Locking». В своем оригинальном варианте:

Не работает! Почему? Это отдельная тема, но для интересующихся могу посоветовать прочитать эту статью http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html.

Но не надо совсем отчаиваться, в JAVA 5 проблему решили, используя модификатор volatile. На данный момент решение выглядит так:

Вариант пятый:

Не смотря на то, что этот вариант выглядит как идеальное решение, использовать его не рекомендуется т.к. товарищ Allen Holub заметил, что использование volatile модификатора может привести к проблемам производительности на мультипроцессорных системах. Но решать все же вам.

Вот, в общем-то, и все распространенные варианты имплементаций данного паттерна. Но, на этом не заканчиваются подводные камни Singleton-а. Существуют еще несколько моментов, которые нужно учитывать во время проектирования того или иного приложения, использующего Singleton.

Подводные камни

1. Наследование

В подавляющем большинстве случаев в Singleton классах наследование не нужно и, более того, излишне и является следствием over-design. Да и реализация наследования имеет определенные сложности, учитывая, что и сам instance и метод getInstance() статические.

Поэтому, я рекомендую использовать модификатор final и запретить наследование данного класса, если нет особой необходимости в обратном.

2. Две и более виртуальных машины

Каждая виртуальная машина создает свою копию Singleton объекта. И хотя на первый взгляд это выглядит очевидным, во многих распределенных системах, таких как EJB, JINI и RMI все не так просто. Когда промежуточные уровни скрывают (делают прозрачными) распределенные технологи, бывает трудно сказать, где и когда инициализирован объект.

3.Различные Class Loader-ы

Когда 2 class loader-а загружают класс, каждый из них может создать свою копию Singleton-а(в тех случаях, когда instance инициализируется class loader-ом ). Это особенно актуально в использовании сервлетов(servlet), так как в некоторых имплементациях серверов приложений(application server) каждый сервлет имеет свой class loader.

Существует еще ряд проблем, которые менее актуальны (такие как технология reflection и имплементация интерфейсов Cloneable и Serializable), и не будут мною рассмотрены в силу своей экзотичности в сфере применения Singleton классов. Но, в любом случае, с радостью отвечу на любые вопросы к этому материалу.

Вот, в общем-то, и все ключевые моменты, которые я хотел осветить в данной статье. Осталось лишь заметить, что данный материал не претендует быть истиной в последней инстанции и допускает существование точек зрения, отличающихся от точки зрения автора. И даже более того, любые замечания приветствуются и будут прияты к сведению.

Спасибо за внимание.

Для чего нужен singleton? — Хабр Q&A

В буквальном смысле синглтон призван упростить владение, инициализацию, контроль времени жизни и доступ к элементам глобального состояния программы. Эта фраза является самой важной. А важнее всего — правильно понять ее.

Подход многократно обличался антипаттерном за то, что «глобальное состояние программы — это зло», не смотря на то, что глобальное состояние продолжает оставаться в программе не смотря на удаление всех синглтонов из проекта.
Я видел проекты с более чем 50 синглтонами и очень тяжелыми проблемами их связи между собой. В синглтоны без разбора и по незнанке вытаскивали буквально все. Это яркий пример антиподхода применения абсолютно любого паттерна.
Важно понимать что никакой элемент проектирования не является антипаттерном, он приводит к проблемам только при неумелом использовании.

Приложение состоящее ровно из одной UI формы будет иметь глобальное состояние в виде этой формы вне зависимости от того, будет ли эта форма оформлена как синглтон или нет. Просто, если нет, то этой формой приходится управлять иными путями, не всегда более удобными чем синглтон.

В качестве альтернативы синглтонам пропагандируются два других подхода: Registry / Service locator и Dependency injection.
К слову, все альтернативы столь же активно и все так же незаслуженно обзываются антипаттернами. 🙂

Теперь к примерам.
DirectX. Для работы с графикой тебе необходимо по одной инстанции интерфейсов IDirect3D и IDirect3DDevice. Эти две инстанции декларируют глобальное состояние программы. Инстанции всех буферов, текстур, шейдеров и поверхностей создаются с использованием этих инстанций. Разумным будет предоставить доступ к инстанциям DirectX через подход синглтона.
OpenGL старых добрых версий. Процедурный интерфейс OpenGL как бы намекает на отсутствие необходимости в глобальном состоянии. Но не тут то было. Для работы с OpenGL необходимо не просто создать контекст, но еще и помнить поток, в котором этот контекст связан с поверхностью вывода. В многопоточной среде контекстов может быть несколько для параллельной загрузки ресурсов. В этом случае помнить надо уже два потока и два контекста (минимум). Само собой, в синглтоне это глобальное состояние смотрится удобнее.
Sockets. Не важно какие. Когда твое приложение представляет собой MMO проект и у тебя гора подсистем, постоянно и обособленно общающихся с сервером, сетевое подключение разумно оформить в виде синглтона.
Assets/Resources — они бывают разные, кешируемые и нет, доступные из сети, с жесткого диска, из подсистемы пререндеринга. Опять же, я несколько раз видел боль и страдания от неоднородного контроля ресурсов без соответствующей подсистемы. А сама подсистема управления ресурсами всегда централизована и лучше всего реализуется именно на синглтоне.

Звук, ввод, многопоточный конвеер задач… вспоминать места явной необходимости синглтонов можно еще долго.

«Я — синглтон». Почему людям для счастья больше не нужны отношения — Нож

В прошлом

Значительные изменения в понимании феномена одиночества произошли в начале ХХ столетия, когда мужчины и женщины без пары: молодые профессионалы, представители богемы и интеллигенции, геи и феминистки — устремились в большие города. Целые районы, такие как Гринвич-Виллидж в Нью-Йорке, Сохо в Лондоне и Монпарнас в Париже, стали заселять инакомыслящие одиночки — и именно здесь рождались самые передовые идеи того времени.

В крупных городах России дух перемен, воспетый русскими авангардистами, и социальные последствия революции привели к пертурбациям в семейной сфере. Традиционное супружество вытесняет новая форма внебрачных отношений — сожительство, увеличивается число разводов, процветает свободная любовь. Остро стоит квартирный вопрос, люди ютятся в коммуналках — иметь семью теперь экономически невыгодно.

Ровно век спустя мы снова становимся свидетелями социальных процессов, способствующих переоценке «преимуществ» семейной жизни, всегда считавшихся очевидными. В ближайшие годы женатые люди могут оказаться в меньшинстве — пришло время одиночек.

Статистика

«В наши дни одинокими являются более 50 % взрослых американцев; 31 млн человек… проживают в одиночестве.
<…>
…[В] Швеции, Дании, Норвегии и Финляндии — стран[ах], имеющих один из самых высоких уровней жизни… около 40 % домохозяйств состоит всего из одного человека.
<…>
…Во всём мире число людей, проживающих в одиночестве, резко увеличилось — со 153 млн в 1996 году до 201 млн в 2006 году, то есть за 10 лет количество таких людей возросло на 33 %».

По результатам последней переписи населения, в России 40 % населения имеют статус одиноких — никогда не состояли в браке (зарегистрированном или так называемом гражданском), вдовствуют или разведены. При этом, согласно данным опроса ВЦИОМ, 79 % россиян вовсе не чувствуют себя одиноко, а 54 % опрошенных отсутствие пары не пугает.

Современные одиночки

The Guy — Чувак — безымянный герой сериала High Maintenance, который третий сезон выходит на остросоциальном канале НВО, — пример современного одиночки, или «синглтона». Впервые это понятие использовал в 2012 году социолог, доктор философии Нью-Йоркского университета Эрик Кляйненберг.

Синглтоны — жители больших городов, которые непрочным семейным связям и сомнительным отношениям предпочитают одиночество.

Чувак, как и многие другие мужчины и женщины его поколения, ведет насыщенную социальную жизнь, успешен в своем деле, очевидно нравится людям — и у него нет пары.

Создатель сериала и исполнитель главной роли Бен Синклер говорит в интервью: «Вначале мы хотели, чтобы он чувствовал себя одиноко, а потом подумали: эй, а что, если с ним всё нормально?» Многочисленные исследования жизни синглтонов подтверждают: так оно и есть.

«В наши дни молодые одиночки, — пишет Кляйненберг, — стремятся активно „переформатировать“ представление о том, что их существование является показателем социального фиаско, в прямо противоположное — что оно свидетельствует о неординарности личности и об успехе. <…> Инвестиции в себя необходимы потому, что современные семьи часто распадаются, работа не является стабильной, и в конечном счете каждый из нас может надеяться только на самого себя».

«Я вполне гармонично ощущаю себя в статусе одинокого человека и не понимаю людей, которые всеми силами пытаются его изменить. Если появляется подходящий человек — это другое дело. А до тех пор нужно наслаждаться жизнью и как можно круче раскрывать себя, а потом будет что и в детей вложить».

Наташа, 33 года, градостроительница

Сегодня всё реже используются такие эпитеты, как «холостяк», «старая дева», «разведенка». Очевидно, что семейный статус мужчины никак не сказывается на его способности к зачатию. Зато отцы, оказавшиеся в этой роли без особого желания, плохо с ней справляющиеся или вовсе ее отвергающие, склонны страдать от чувства вины и рискуют вызвать резкое осуждение в обществе.

«Многие считают, что я просто боюсь брать на себя ответственность за женщину и ребенка — оттого и не завожу семью. Но пока я не вполне понимаю, для чего мне это нужно. У меня остаются сомнения, что благодаря таким изменениям моя жизнь станет лучше. А идти на это из-за предрассудков о „правильной жизни“ и „мужском долге“ я, конечно, не буду!»

Евгений, 42 года, архитектор

В стране, где более половины браков заканчиваются разводами, пренебрежительное отношение к одиночкам и вовсе нелепо и становится моветоном. Тем не менее такие люди продолжают испытывать на себе социальное давление. Доктор философии Белла Депауло, которая сама всю жизнь обходится без пары, в своей книге говорит о дискриминации одиноких людей и даже вводит особый термин — «синглизм» (по аналогии с «расизмом» и «сексизмом»).

Проявлений синглизма множество — от упущений в законодательных актах до привычной пренебрежительной манеры общения с неженатыми людьми.

«Мама переживает по поводу моего одиночества. Да, это на меня влияет. Иногда я начинаю загоняться, хотя и понимаю, что зря».

Наталья, 37 лет, режиссер

Депауло утверждает: уровень счастья у семейных людей лишь немного выше, чем у одиноких, а по прошествии некоторого времени он снова достигает прежней отметки. Замужние женщины в той же мере подвержены стрессу, депрессии, так же часто чувствуют себя «покинутыми», как и те, что живут без «второй половинки»: «Одинокие люди не заслуживают пренебрежительного отношения к себе и дискриминации, такое поведение обусловлено стереотипами».

Главный страх

«Страшнее смерти может быть только смерть в одиночестве» — опрос показывает, что подобные идеи больше не актуальны. 65 % жителей Москвы и Санкт-Петербурга уверены, что не стали бы сохранять фактически распавшийся брак из-за боязни одинокой старости.

По утверждению Кляйненберга, острее всего одиночество переживают люди, которые недавно овдовели, особенно если после ухода супруга/супруги резко возрастает риск болезни, смерти или маячит пугающая перспектива переезда в дом престарелых.

По статистике, большинство пар в России распадается после 5–9 лет совместной жизни. Тех, кто подает на развод после 20 лет брака, тоже немало — 13 %. Выходит, сохранить отношения до самой смерти удается совсем немногим.

А что, если супруг, на которого возложена почетная миссия провожатого в мир иной, отправится туда раньше? Или, оказавшись на годы прикованным к постели, сам будет нуждаться в постоянном уходе? К тому же не каждому захочется в случае смертельного заболевания полностью зависеть от другого.

«Я привыкла сама о себе заботиться. Мысль о том, что в старости я стану для кого-то обузой, меня ужасает. Лучше я заранее побеспокоюсь о сиделке или месте в доме престарелых, чем позволю мужчине взять на себя эту роль».

Инга, 29 лет, издательница

Жизнь без секса хуже смерти

«Больше всего меня пугает отсутствие секса. Что такие периоды будут затягиваться. Но по своему опыту я знаю: не заниматься сексом, когда ты одна, не так мучительно, как когда ты живешь в браке, но секса всё равно нет».

Соня, 35 лет, писательница

По словам Кляйненберга, «жизнь в одиночестве дает несколько преимуществ: сексуальную свободу и пространство, где можно экспериментировать с этой свободой, возможность развиваться, расти и искать настоящую любовь». В то же время приведенные ученым статистические данные, как и результаты других исследований, свидетельствуют, что в жизни синглтонов бывают долгие периоды воздержания:

«Мужчины среднего возраста, снова вступившие в брак, имеют больше шансов жить половой жизнью, чем те, кто развелся, но остался один. 57 % мужчин, проживающих с партнером… заявили, что занимались сексом раз в неделю или больше… по сравнению с 43 % мужчин, проживающих без партнера. <…> Одинокие мужчины мастурбируют в два раза чаще…

Для женщин сексуальных преимуществ в браке еще больше.

[Из тех, кто снова вступил в брак или стал жить с партнером] 54% [занимаются] сексом раз или более в неделю. [Тогда как среди разведенных женщин сексуально удовлетворенных было только 9 %]. Ответы женщин на вопрос о том, живут ли они в целибате, рисуют картину отчаяния: 17 % вновь вышедших замуж и 77 % разведенных и незамужних женщин заявили, что [вообще не ведут половой жизни]».

«В первое время после расставания отсутствие тактильных ощущений причиняет мне сильное физическое страдание. Кажется, я просто не выживу: как же так — не обниматься, спать одному? Постепенно боль затихает и ущерб от отсутствия контакта перестает быть разрушительным. Я как будто частично засыпаю, а остальные функции работают нормально».

Евгений, 42 года, архитектор
У одинокого человека, которого удручает отсутствие секса, есть масса возможностей изменить ситуацию — в то время как люди, связанные семейными узами, лишены такой привилегии.

Исследование, ставившее целью определить степень интегрированности одиночек в общественную жизнь, подтверждает: синглтоны имеют больше контактов с родственниками, соседями и друзьями, чем те, кто состоит в браке. «Есть все основания утверждать, что живущие в одиночестве люди компенсируют свое состояние повышенной социальной активностью, превышающей активность тех, кто проживает совместно, а в городах, где много одиночек, бурлит культурная жизнь».

В большом городе

«Становясь всё более популярным, этот феномен изменяет „социальную ткань“ и представление о человеческих взаимоотношениях, влияет на особенности градостроительства и развития экономики», — продолжает Кляйненберг. И далее: «Большинство живущих в одиночестве — не бедные, а, напротив, финансово независимые люди».

Быть синглтоном выгодно экономически. Человек располагает большим количеством времени, которое может потратить в том числе на работу, что при должном усердии обеспечит рост доходов.

К тому же когда ты один, то сам несешь ответственность за свои расходы.

Коворкинги, коливинги, новые форматы публичных библиотек, рестораны с общими столами, сидеть за которыми психологически комфортнее, чем за стандартными «на двоих», — жизнь одиночек становится всё более приспособленной под их «специфические» нужды.

Синглтоны — настоящие гейм-чейнджеры на рынке недвижимости. По словам управляющего бюро FlatForma Сергея Хмелёва, Москва продолжает перестраиваться под влиянием нового поколения резидентов. Застройщики разрабатывают и внедряют форматы квартир не только для семей с детьми, но также для пар и одиночек. В некоторых жилых комплексах предлагаются апартаменты площадью от 14 м2 — для тех, кто приходит домой, чтобы переночевать.

Свойственное одиночкам стремление к комфорту и бережное отношение к личным границам помогают им более эффективно организовывать свою жизнь.

«У меня был идеальный формат отношений: у нее есть свой дом, у меня — свой. Мы жили в одном округе Москвы, дорога занимала 20 минут. Мне очень нравилось бывать у нее, я всегда мог позвать ее к себе или остаться дома один».

Евгений, 42 года, архитектор

Одни, но не одиноки

Мы постоянно окружены людьми. Нас учат думать, что сами мы не способны сделать себя счастливыми, что для этого нам обязательно нужен кто-то еще.

«В состояние одиночества нужно погрузиться, осознать его, прочувствовать. Поначалу оно может вызывать дискомфорт и даже страдание, но, прислушавшись к себе, вы обнаружите, что на самом деле так намного приятнее, чем находиться рядом с неподходящим человеком».

Соня, 35 лет, писательница

Многие из тех, кто когда-либо жили в одиночестве, подтвердят: нет состояния более естественного и гармоничного, если принимать его сознательно, не обращая внимания на общественное мнение или навязчивую социальную политику государства.

«Я единственный ребенок в семье. У меня всегда была своя комната, я привыкла с детства быть одна. Это состояние для меня естественно. Был период, когда я снимала квартиры с другими людьми, — интересный опыт и в целом фан. Но когда у меня снова появилось свое жилье, я вздохнула с облегчением».

Наталья, 37 лет, режиссер
Спокойное отношение к одиночеству позволяет нам адекватнее оценить наши социальные связи и сделать выбор в пользу тех людей, находиться с которыми нам так же комфортно, как с самими собой.

Если же общение происходит по инерции, если нами движут социальные установки или нерациональные страхи — может, стоить дать себе время подумать? В одиночестве.

Одиночка

Также известен как: Singleton

Суть паттерна

Одиночка — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.