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
_service
et _waithandle
situés? exemple? statique? autre? Cela pourrait , par exemple, être délibérément synchroniser l'accès à un serveur distant ...