В случае new
значение Type
не имеет значения, экземпляр имеет значение. В этом случае вы говорите об объекте synclock : объекте, который используется для блокировки раздела (ов) кода (ов) для предотвращения одновременного доступа.
Использование другого Type
, чем object
для синхронизации, является пустой тратой памяти, потому что вы не используете этот экземпляр для чего-либо еще.
Существуют обстоятельства, при которых вы можете заблокировать другой тип: когда вам нужно заблокировать конкретный экземпляр.
Основная проблема: экземпляр должен быть инициализирован, чтобы заблокировать его. И в большинстве случаев вы хотите синхронизировать инициализацию экземпляра:)
Но в некоторых случаях вы можете заблокировать экземпляр напрямую; как словарь например (ну почти прямо в этом случае;)).
private Dictionary<string,string> _dictionary = new Dictionary<string,string>();
public void AddValue(string key, string value)
{
lock (((IDictionary)_dictionary).SyncRoot) // SyncRoot recommended
{
if (!_dictionary.ContainsValue(value))
_dictionary.Add(key, value);
}
}
Но дело в том, что даже если это сработает, всегда спрашивайте себя: «Не лучше ли вместо этого создать конкретный блокирующий объект»?