2015-12-21 57 views
1

正如書名我這種情況可選的線程安全(線程只有在條件安全部分)

lock (_myLockObj) 
{ 
    // protected section here (select + update over SQL Tables) 
} 

這偉大工程說明,但有時我不需要線程安全的,因爲是由金銀幣沒有保證錯誤可能發生(即使兩個線程運行在parralel中)但我需要速度。 目前,程序可以理解線程何時可能存在線程安全問題,何時不可以(以及何時不需要儘可能快)。

我會達到的目標是鎖定指令的optionallity,所以只有在適當的條件下才能生效。

如:

lock (_myLockObj) && flag 

我敢肯定,鎖定關鍵字不提供語義,我會明白是什麼,是實現這一行爲的正確方法。

+0

,你的意思是,你知道,鎖定對象不可能被鎖定:

您可以直接使用這些方法呢?或者你的意思是它可以被鎖定,但是你仍然不需要獲得它? (如果是後者,爲什麼不通過使鎖更細粒度來解決問題?) –

+0

我的方法完全是線程安全的,所以通常我不需要鎖定。 什麼不是線程安全的是使用linq進行的表操作,因爲數據庫是每個線程的共享資源。 可能會發生兩個線程嘗試對相同數據提交兩種截然不同的操作,這是一個問題。 這種情況很少見,我可以理解它什麼時候會發生,什麼時候肯定不能發生(大多數數據只需要插入並保證是一次插入)。 當我確信它不可能發生,我wuold避免鎖定isntruction(獲得速度) – Skary

+0

@Skary它可能會更好地處理它使用數據庫事務,而不是線程同步。 –

回答

3

lock聲明是Monitor.Enter + Monitor.Exittry/finally塊中的語法糖。當你說你不需要線程安全

bool flag = false; 
bool acquiredLock = false; 
try 
{ 
    if (flag) 
    { 
     Monitor.Enter(_myLockObj, ref acquiredLock); 
    } 


} 
finally 
{ 
    if (flag & acquiredLock) 
    { 
     Monitor.Exit(_myLockObj); 
    } 
}