что произойдет, если несколько потоков попытаются получить доступ к одноэлементному объекту

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

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

5 ответов


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

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

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

удачи!


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


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


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

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

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


тогда вам нужна потокобезопасная реализация одноэлементного шаблона.

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

HTH!