2013-09-24 49 views
2

我的問題聽起來像許多人在這裏,但它有一種我沒有發現的味道。c中的鎖碼部分#

我想了解以下邏輯

一般目的

public class GenericClass 
{ 
    public static void DoSomething(Object lockObj) 
    { 
     lock(lockObj) 
     { 
      // do something here 
     } 
    } 
} 

A類

internal class A 
{ 
    private static _aLock = new Object(); 

    public void Do_A_Thing() 
    { 
     GenericClass.DoSomething(_aLock); 
    } 
} 

B類

internal class B 
{ 
    private static _bLock = new Object(); 

    public void Do_B_Thing() 
    { 
     GenericClass.DoSomething(_bLock); 
    } 
} 

我只是希望確認是否我的解釋是正確的:

如果類「A」的多個線程將嘗試同時訪問「genericClass」方法「DoSomething」中的代碼,則此方法將被鎖定到除「A」類的所有實例之外的所有實例。但是類「B」的單個實例將隨時可以繼續執行。如果類「B」也有多個實例執行,它們不會干擾類「A」鎖。

這是正確的,基於你在上面看到什麼?

+0

是的......雖然結構似乎有點可怕 – Yaur

+0

你真的有';'在'lock(lockObj);'?你不應該。這就像'if(someCondition); {// do stuff}':你只是將'lock'或'if'應用於由';'指示的空語句,而不是由'{}'指示的代碼塊。 –

+0

一般而言,您希望您的鎖定對象是私有的,以便您知道其他人無法鎖定它們。傳遞他們需要對調用者有很多信任(和知識)。 –

回答

3

是的,您的描述聽起來正確。在中傳遞鎖對象也許有點不尋常,但它可以正常工作。我建議的唯一更改是使static字段readonly,以便您不會意外地將該值更改爲不同的object參考。

2

是的,這是正確的。 A中的鎖和B中的鎖完全不知道對方。只有當另一個線程使用與標識符相同的對象鎖定它時,代碼纔會被阻止。

2

您的結論是正確的,但傳遞鎖定對象並不是一個好習慣。我建議分別將lock放入A級和B級。

我建議寫:

internal class A 
{ 
    private static readonly _aLock = new Object(); 

    public void Do_A_Thing() 
    { 
     lock (_aLock) 
     { 
      GenericClass.DoSomething(); 
     } 
    } 
} 

你有特殊原因,把鎖在另一個類?也許你可以用不同的方式解決你的問題?請注意,在某些情況下,如果A類和B類互相呼叫(A-> B-> A),則可能不是您的情況,您可能會發生死鎖。

+0

你所建議的是我使用過數百次的典型情況。現在的問題是,我希望泛型類是一個..泛型。它應該存儲和檢索一些對象所需的緩存。但是每個對象都有自己的緩存。我想每個類型只有一個實例來檢索或存儲數據。一種解決方案是使用緩存功能來繼承基礎對象。但現在這是不可能的。看起來我的想法得到了證實。 –

+0

它是'GenericClass ',鎖定對象是否被'T'鍵入?因爲這樣,你可以在'GenericClass '中聲明'private static readonly object _lockObject = new object();',它爲每個'T'提供一個不同的鎖對象。 –

0

如果使用的是仿製藥,然後像

public class MyGadget<T> 
{ 
    static readonly SyncRoot = new object() ; 

    public T SynchronizedMethod() 
    { 
    lock (SyncRoot) 
    { 
     SynchronizedMethodGuts() ; 
    } 
    } 

} 

應該做你想要什麼,因爲MyGadget<Foo>MyGadget<Bar>不同類別:他們每個人都有自己不同的SyncRoot場。

+0

這是一個有趣的想法,甚至可能適用於我的情況。不同的是,我的「通用」只知道如何執行某些操作,不需要實例。在這裏我需要一個實例。我只是認爲,這對我來說是過分的,而不是真正的原因.Net的泛型是爲了。 –