В тех случаях, когда у меня есть не поточнобезопасный объект (такой как NetworkStream), к которому нужно обращаться из нескольких потоков, безопасно ли держать объект, который будет использоваться для блокировки, чтобы защитить не поточныйбезопасный объект, в значении ConcurrentDictionary (или обычный словарь)?
то есть, таким образом, у меня может быть несколько потоков, каждый из которых пытается записать данные в клиентский NetworkStream, но в каждый раз допускается только один поток?
Я предполагаю, что это безопасно, поскольку объектссылочный тип, но надеялся, что кто-нибудь сможет подтвердить.
Пример с использованием ConcurrentDictionary.Метод Send () будет вызываться несколькими потоками.Цель состоит в том, чтобы позволить нескольким вызывающим пользователям иметь доступ для записи в NetworkStream, и мне любопытно, может ли объект, найденный в значении ConcurrentDictionary, надежно использоваться в этом случае для блокировки.
// Assume this is prepopulated
private ConcurrentDictionary<string, object> locks = ...
public void Send(string identifier, byte[] data)
{
object clientLock = null;
if (locks.TryGetValue(identifier, out clientLock))
{
lock (clientLock)
{
// assume we have the TcpClient here
NetworkStream ns = client.GetStream();
ns.Write(data, 0, data.Length);
}
}
}