Es ist sehr üblich, ein privates statisches schreibgeschütztes Objekt zum Sperren von Multithreading zu verwenden. Ich verstehe, dass privat die Eintrittspunkte zum Sperrobjekt reduziert, indem die Kapselung verschärft wird und daher auf das Wesentlichste zugegriffen wird.
Aber warum statisch?
private static readonly object Locker = new object();
Am Ende wird das Feld nur in meiner Klasse verwendet, und ich könnte stattdessen auch nur Folgendes verwenden:
private readonly object Locker = new object();
Irgendwelche Kommentare?
AKTUALISIEREN:
Als Beispiel habe ich diesen Code eingefügt (nur ein Beispiel). Ich könnte ein statisches oder nicht statisches Schließfach verwenden und beide würden gut funktionieren. In Anbetracht der folgenden Antwort sollte ich mein Schließfach eher so definieren? (Entschuldigung, ich habe nächste Woche ein Interview und muss jedes Detail kennen :)
private readonly object Locker = new object();
Und hier ist der 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();
}
Vielen Dank
_service
und befinden _waithandle
sich? Beispiel? statisch? andere? Das könnte zum Beispiel sein, dass der Zugriff auf einen Remote-Server absichtlich synchronisiert wird ...