137 votes

Pourquoi l'objet de verrouillage doit-il être statique?

Il est très fréquent d'utiliser un private static readonly objet de blocage dans les multi-threading. Je comprends que privé réduit les points d'entrée pour le verrouillage de l'objet par un resserrement de l'encapsulation et, par conséquent, l'accès à l'essentiel.

Mais pourquoi statique?

private static readonly object Locker = new object();

À la fin du champ est utilisé uniquement dans ma classe seulement, et j'aurais aussi pu utiliser ceci à la place:

private readonly object Locker = new object();

Tous les commentaires?

Mise à JOUR:

Comme un exemple, j'ai collé ce code (juste un exemple). Je pourrais utiliser statique ou non statique locker sur cette question et les deux fonctionnent très bien. Compte tenu de la réponse ci-dessous, je devrais être plutôt la définition de mon armoire comme ça? (Désolé, j'ai un entretien la semaine prochaine et le besoin de connaître tous les détails :)

private readonly object Locker = new object();

Et voici le code:

    private int _priceA;
    private int _priceB;
    private EventWaitHandle[] _waithandle;
    private readonly IService _service;

//ctor
public ModuleAViewModel(IService service)
    {
        _service = service;
        _modelA = new ModelA();
        _waithandle = new ManualResetEvent[2];
        _waithandle[0] = new ManualResetEvent(false);
        _waithandle[1] = new ManualResetEvent(false);
        LoadDataByThread();
    }


 private void LoadDataByThread()
        {
            new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceA = _service.GetPriceA();
                                   }
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceB = _service.GetPriceB();
                                   }
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                               PriceA = _priceA;
                               PriceB = _priceB;
                           }).Start();
        }

Merci

206voto

Marc Gravell Points 482669

Il n'est pas "très commun d'utiliser une private static readonly objet de blocage dans les multi threading" - plutôt, il est courant d'utiliser un verrou à l' / choisi granularité. Parfois, c'est - static. Le plus souvent, de l'OMI, il ne l'est pas - mais est instance de base.

Le principal fois que vous voyez un static de verrouillage est un cache global, ou de différer le chargement des données globales / singletons. Et dans le dernier, il y a de meilleures façons de le faire de toute façon.

Donc ça dépend vraiment: comment est - Locker utilisé dans votre scénario? Est-il protéger quelque chose qui est lui-même statique? Si oui, le verrouillage doit être statique. Si c'est la protection de quelque chose qui est de l'instance , de l'OMI, le verrouillage doit également être exemple.

95voto

Guffa Points 308133

Il n'a pas à être statique, en fait, parfois, il doit pas être statique.

La variable doit vivre dans le même champ d'application que les méthodes dans lesquelles vous pouvez utiliser pour le verrouillage. Si les méthodes sont statiques, la variable doit être statique, et si les méthodes sont des méthodes d'instance, la variable doit être une instance varible.

Une variable statique continue de fonctionner lorsque utilisée pour verrouiller dans une méthode d'instance, mais ensuite, vous serez verrouillage de trop. Vous et verrouiller toutes les méthodes dans tous les cas, pas seulement les méthodes dans la même instance.

32voto

Erno de Weerd Points 30391

L'étendue et la durée de vie d'un verrou peuvent / devraient dépendre de la «chose» que vous voulez verrouiller. Les verrous statiques sont principalement utilisés pour verrouiller des objets statiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X