что происходит, если более одного потока пытается получить доступ к одноэлементному объекту - PullRequest
7 голосов
/ 24 августа 2009

Не во время создания экземпляра, а после создания экземпляра одноэлементного объекта, что произойдет, если два или более потоков попытаются получить доступ к одному и тому же одноэлементному объекту? Особенно в случае, когда одноэлементному объекту требуется много времени для обработки запроса (скажем, 1 мин) ... В этом случае, если, например, 5 потоков пытаются получить доступ к одному и тому же одноэлементному объекту, каким будет результат?

Дополнительный вопрос: обычно, когда мы должны идти по шаблону синглтона и когда мы должны избегать его?

Ответы [ 5 ]

5 голосов
/ 24 августа 2009

Если в Singleton не выполняется синхронизация (блокировка), ответ таков: это бесплатно для всех.

Хотя Singleton гарантирует, что при запросе используется только один экземпляр объекта, сам шаблон по сути не обеспечивает какой-либо формы безопасности потока. Это оставлено на усмотрение разработчика.

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

Удачи!

2 голосов
/ 24 августа 2009

Общее правило, которое я использую для Singletons, заключается в том, что это не должно влиять на работающий код и не иметь побочных эффектов. По сути, для меня в моих проектах это выражается в какой-то функциональности ведения журнала или в поиске статических значений (т.е. однажды загружает некоторые общие данные из базы данных и сохраняет их для справки, чтобы их не приходилось читать каждый раз, когда это необходимо) .

0 голосов
/ 20 июля 2013

Тогда вам понадобится поточно-ориентированная реализация шаблона синглтона.

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

НТН!

0 голосов
/ 24 августа 2009

Ответ на ваш вопрос, как он есть, «это действительно зависит». Что за синглтон? то есть что он делает и как он это делает? И на каком языке?

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

Таким образом, если код правильно (с правильно реализованной синхронизацией потоков), нет причины, по которой он не должен вести себя правильно - даже если запросы к объекту занимают очень много времени!

0 голосов
/ 24 августа 2009

Синглтон ничем не отличается от любого другого объекта, кроме одного экземпляра. Что произойдет, когда вы попытаетесь получить к нему доступ, будет в значительной степени зависеть от того, что пытаются получить доступ к потокам (то есть чтение против записи) и какие данные хранит ваш синглтон.

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