![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| UnicornMirage |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
Привет всем!
есть такой код (вид синглетона):
также есть куча классов, использующих данный синглетон:
вопрос связан с проблемой создания экземпляра синглетона в многопоточной среде, в которой необходимо синхронизировать процесс создания объекта. Будет ли приведенный здесь способ корректен если объекты классов SomeA, SomeB... выполняются в разных потоках? |
||||
|
|||||
| powerOn |
|
||||||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Вот поставил эксперимент:
В результате:
Т.е. конструктор был вызвал всего один раз. Следовательно, static инициализатор был синхронизирован java runtime системой. Думаю, что все нормально. |
||||||
|
|||||||
| shimopus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 25.8.2006 Репутация: 1 Всего: 1 |
Объект Attribute.EMPTY будет создан только один раз. Но ссылка, которая будет и в SomeA и в SomeB одинаковая, следовательно может возникнуть проблема доступа к этому объекту. Т.е. SomeA, например, будет писать, а SomeB в это время читать. Поэтому места, где будет производится работа с этим объектом в коде надо помечать как
|
|||
|
||||
| UnicornMirage |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
я тоже ставил подобный эксперимент, но мне кажется он не моделирует реальную ситуацию т.к. потоки создаются в одном месте последовательно...
хм... но ведь ссылка помечена как final поэтому ее изменять объекты не смогут. а вообще в своей программе мне не нужно менять ссылку, а только лишь использовать единственный экземпляр класса... почитал тему static это хорошо или плохо которая возбудила некоторые сомнения в моем способе организации констант. |
||||
|
|||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Ну и что? Задержка в конструкторе и моделирует реальную ситуацию... Где еще может быть не атомарная операция? |
|||
|
||||
| UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
хорошо! а тогда почему много существует статей и мнений насчет синхронизации создания синглетона если:
кстати, интересно, а каким образом она синхронизирует? Это сообщение отредактировал(а) UnicornMirage - 11.12.2006, 12:51 |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
static один в пределах JRE для конкретной static переменной.
И инициализируется при первом обращении и загрузке класса. То есть не загружает два раза класс в память. То есть класс(и, соответственно, static) - один на JRE. Правда.. Если используются несколько класслоадеров.... ;) Но это не общий случай. С созданием твоего финал статика - ноу проблем. Тут не волнуйся. А вот с использованием.... final гарантирует только то, что будет указывать на конкретный объект, созданный при инициализации. Но вот внутреность объекта можно будет менять всем, кто получит ссылку на него(и A, и B...) То есть... необходимо или синхронизировать методы этого объекта(Attribute) как уже упоминал shimopus. Или открыть для наружного применения лишь аксессоры - запретить кому-либо модифицировать его рантайм. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
насчет того что нужно ли синхронизировать доступ к переменной EMPTY - внутри моего класса Attribute есть только один метод и нет внутренних переменных кроме как ссылки на самого себя, поэтому наверное синхронизация не нужна в данном случае.
вот полный код класса:
всё понял, спасибо за разъяснение! |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |