блокировка c # с использованием приватных переменных - PullRequest
4 голосов
/ 31 октября 2011

по Эрику Ганнерсону

Не

  • Использовать блокировку (это)
  • Использовать блокировку (typeof ())

Не Блокировка на личную переменную, а не на то, что пользователь может видеть Используйте «ключ объекта = новый объект ()», если вам нужен закрытый ключ для блокировки

в чем причина ??

Ответы [ 2 ]

14 голосов
/ 31 октября 2011

в чем причина ??

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

Рекомендуется блокировать частные статические переменные, например:

private static object _syncRoot = new object();

, а затем:

lock(_syncRoot)
{
    ...
}

частные переменные экземпляра также могут быть опасными, посколькуэкземпляр вашего класса не является чем-то, что вы как разработчик класса владеете.Это пользователь класса, которому принадлежит экземпляр.

2 голосов
/ 31 октября 2011

Вы должны действительно найти старые вопросы по этому вопросу, прежде чем публиковать новые. Замок

Также Дарин Димитров неправ, когда говорит, что блокировки частных переменных опасны. Блокировки закрытых переменных служат для синхронизации ресурсов конкретного экземпляра вашего класса. Это может произойти, когда у вас есть

// A Client which listens to several servers
public class Client
{
private static object logSync = new object();
private readonly Dictionary<string, Server> servers = new Dictionary<string, Server>();// .... some code for initialization ...

// Disposing a server. 
public void Dispose (string serverName)
{
    //  the lock needed here is on private variable. This purpose cannot be achieved with a      
    //  lock on private static object. Well you can achieve the purpose but you will block
    //  all Client instances when you do so, which is pointless.
    //  Also notice that services is readonly, which is convenient
    //  because that is the object we took a lock on. The lock is on the same object always
    //  there is no need to unnecessarily create objects for locks.  
    lock(services)
    {
        // ... Do something cleanup here ...
        Server server;
        if (servers.TryGetValue(serverName, out server))
        {
             server.Dispose();
             servers.Remove(serverName);
        }
    }
}

// on some message that has to be logged  
public void OnMessage(string message, Server server)
{
    // This makes sure that all clients log to the same sink and 
    // the messages are processed in the order of receipt
    lock (logSync)
    {
        Log(evt);
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...