Что ж, это определенно сделает получение и установку свойства Connector
поточно-безопасным (хотя я бы сделал _syncObject
только для чтения). Однако это не делает DataAccess
поточно-безопасным ... мьютекс будет применяться только , пока потоки получают и устанавливают свойство .
Другими словами, если обе темы выполняют:
ABC.DataAccess.DoSomeLongRunningOperation();
, тогда DoSomeLongRunningOperation()
будет по-прежнему выполняться одновременно двумя потоками. Если эта операция не является поточно-ориентированной, она все равно будет проблемой.
Если вы хотите, чтобы только один поток за раз использовал DataAccess
, вы могли бы написать:
public static void UseConnector(Action<DataAccess> action)
{
lock (_syncObject)
{
action(_connector);
}
}
Тогда, если два потока оба делают:
ABC.UseConnector(access => access.DoLongRunningOperation());
, тогда DoLongRunningOperation()
будет работать только в одном потоке за раз. У вас все еще есть проблема, которую плохо ведущие клиенты могут написать:
DataAccess naughty = null;
ABC.UseConnector(access => naughty = access);
// Haha! I've circumvented your thread safety!
naughty.DoLongRunningOperation();
... но, надеюсь, это не проблема для вас.