Il est très courant d'utiliser un objet statique privé en lecture seule pour le verrouillage en multi threading. Je comprends que le privé réduit les points d'entrée à l'objet de verrouillage en resserrant l'encapsulation et donc l'accès au plus essentiel.
Mais pourquoi statique?
private static readonly object Locker = new object();
À la fin, le champ n'est utilisé que dans ma classe uniquement, et je pourrais également l'utiliser à la place:
private readonly object Locker = new object();
Des commentaires?
METTRE À JOUR:
A titre d'exemple, j'ai collé ce code (juste un exemple). Je pourrais utiliser un casier statique ou non statique à ce sujet et les deux fonctionneraient bien. Compte tenu de la réponse ci-dessous, je devrais plutôt définir mon casier comme ça? (Désolé, j'ai une interview la semaine prochaine et j'ai besoin de connaître chaque détail :)
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
la source
_service
et_waithandle
situés? exemple? statique? autre? Cela pourrait , par exemple, être délibérément synchroniser l'accès à un serveur distant ...Réponses:
Il n'est pas "très courant d'utiliser un objet statique privé en lecture seule pour verrouiller en multi threading" - plutôt, il est courant d'utiliser un verrou à la granularité appropriée / choisie . Parfois c'est
static
. Le plus souvent, l'OMI, ce n'est pas le cas - mais il est basé sur une instance .La principale fois que vous voyez un
static
verrou est pour un cache global, ou pour le chargement différé de données globales / singletons. Et dans ce dernier, il y a de meilleures façons de le faire de toute façon .Cela dépend donc vraiment: comment est-il
Locker
utilisé dans votre scénario? Protège-t-il quelque chose qui est lui - même statique? Si tel est le cas, le verrou doit être statique. S'il protège quelque chose qui est basé sur une instance , alors IMO le verrou doit également être basé sur une instance.la source
Il n'est pas nécessaire que ce soit statique, en fait parfois, il ne devrait pas être statique.
La variable doit vivre dans la même portée que les méthodes où vous l'utilisez 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 variable d'instance.
Une variable statique fonctionnera toujours lorsqu'elle est utilisée pour verrouiller une méthode d'instance, mais vous serez alors trop verrouillée. Vous verrouillez toutes les méthodes dans toutes les instances, pas seulement les méthodes de la même instance.
la source
La portée et la durée de vie d'un verrou peuvent / doivent dépendre de la «chose» que vous souhaitez verrouiller. Les verrous statiques sont principalement utilisés pour verrouiller les objets statiques.
la source