Можно ли одновременно вызывать метод из одноэлементного объекта из нескольких потоков?

У меня есть компонент, зарегистрированный в Castle Windsor как одиночный. Этот объект используется во многих других местах моего приложения, которое многопоточно.

Возможно ли, что два объекта одновременно вызовут один и тот же метод из одного синглтона или "вызов" будет заблокирован до тех пор, пока предыдущий объект не получит результат?

Спасибо

3 ответа

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

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

Чтобы синхронизировать, вам может потребоваться использовать оператор блокировки или другие формы технология синхронизации потоков.

Вы можете обратиться к этой статье из Википедии, в которой также содержится информация о локальном хранилище потоков С#.


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

Вы можете заблокировать часть кода с помощью lock-statement и здесь статья о том, как Thread-Synchronization работает в .Net.


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

http://tutorials.csharp-online.net/Singleton_design_pattern:_Thread-safe_Singleton

licensed under cc by-sa 3.0 with attribution.