Синглтоны без гражданства и параллелизм
У меня есть вопрос о синглетонах без гражданства. У меня также есть вопрос о синглетонах с государством.
Одноэлементные сервисы без сохранения состояния являются хорошим способом помочь с масштабируемостью. Программист, который спроектировал проект, который я поддерживаю, в основном сказал, что не будет проблем параллелизма, потому что "это просто код" (то есть класс Singleton). Значение класса не имеет переменных уровня класса. Это просто методы.
Здесь мои знания C# становятся немного туманными. Есть ли какая-либо возможная проблема, когда 2 пользователя через отдельные веб-запросы одновременно обращаются к одноэлементному файлу без сохранения состояния? Могут ли они оказаться в одном методе в одно и то же время? Это вообще возможно? Если так, значит ли это, что они будут использовать одни и те же локальные переменные в этом методе? Похоже, большой беспорядок, поэтому я предполагаю, что это просто не может произойти. Я предполагаю, что каким-то образом вызовы методов никогда не загрязняются другими пользователями.
Я спрашивал многих коллег об этом, и никто не знает ответа. Так что это сложная проблема.
Мой вопрос о синглетонах, как правило, заключается в том, есть ли проблема с 2 или более одновременными пользователями, читающими публичное свойство Singleton. Я заинтересован только в чтениях. Есть ли вероятность какого-то исключения из параллелизма, когда свойство не находится внутри блока блокировки? Или одновременное чтение безопасно? Я не хочу использовать lock
ключевое слово, так как это снижение производительности, которое мне не нужно.
Спасибо
1 ответ
Синглтон - это анти-паттерн. Синглтон без гражданства еще хуже. Если что-то не удерживает состояние, нет даже малейшей причины сделать его единственным.
Синглтон без состояния - это чисто статическая функция от человека, который любил добавлять шаблон, не задумываясь о том, чего он добьется. Потому что в этом случае он бы заметил, что ничего не добивается.
Если вы видите синглтон без состояния, вы можете безопасно удалить каждый бит кода, который делает его синглтоном. Добавить static
к определению класса. Готово. Намного лучше, чем раньше.
Я думаю, что вы довольно смущены многопоточностью, синглтоном или нет. Я предлагаю вам прочитать хорошую книгу или учебное пособие по этому вопросу, потому что это просто выходит за рамки простого ответа здесь. Если у вас есть общие ресурсы (простой пример, переменная, которая не является локальной), то вам необходимо проявлять особую осторожность в многопоточных средах.
Если вы читаете чаще, чем пишете, используйте ReaderWriterLock
вместо простого lock
может быть полезным. Смотрите здесь.