我不知道這是否是線程安全的或(如果不是),我怎麼可以使之安全。它從一個計時器叫:當我在兩個連續的語句中讀/寫它時,是否需要鎖定一個布爾值?
private volatile bool _isSynchronizing;
private void SynchronizeSessionCache(object state = null)
{
if (_isSynchronizing)
{
Log.Warn($"Aborted synchronization of SessionCache with SessionManager because we are already synchronizing. Interval is: {SynchronizationInterval}");
return;
}
_isSynchronizing = true;
bool lockWasTaken = false;
try
{
// some code that doesn't need a lock ...
// ...
// lock this part
Monitor.Enter(_lockObject, ref lockWasTaken);
// main code ...
}
finally // omitted catch
{
_isSynchronizing = false;
if(lockWasTaken)
Monitor.Exit(_lockObject);
}
}
我擔心的是,它可能是可能的,在他的方法開始一個線程檢查_isSynchronizing
和它的false
在這個時候。然後另一個線程進入主體,因爲線程尚未將其設置爲true
。即使_isSynchronizing
是volatile
,這可能嗎?如果是這樣,使這個方法線程安全的最好方法是什麼?
如果我的理解正確volatile
不能阻止這樣的競爭條件,但只能確保變量沒有被緩存,所以所有線程總是讀取當前值。
是有可能爲兩個胎面越過第一檢查。但是在內部方法中你有一個鎖,所以你期望多個線程進入,所以有什麼想法? – Evk
@Evk:我不希望多個線程進入。 '_lockObject'也用於其他需要訪問共享資源的方法和事件。這在同步過程中必須鎖定。它不應該發生多個線程同時進入。這就是爲什麼我使用_isSynchronizing標誌。 –
那麼我會在這裏使用雙重檢查鎖定。 – Evk