2012-06-05 21 views
1

最近我的一位同事提出了一段代碼,並詢問了關於代碼的線程安全性的意見。下面是一個例子,說明與代碼相同的場景。聲明爲另一個類的靜態成員的類對象的方法的線程行爲

public class classA 
{ 
    public int DoWorkA() 
    { 
     //some logic 
    } 
} 

public class classB 
{ 
    public static classA objA = new classA(); 
} 

public class classC 
{ 
     int DoWorkC() 
     { 

      return classB.objA.DoWorkA(); 

     } 
} 

現在,如果ClassB.objA.DoWorkA()是一樣ClassC,D類不同類別的不同實例simulatenously叫等都會有任何線程或「重疊」的問題? objA應該轉換成實例成員嗎?

回答

2

由於objA是靜態的,因此只會有一個classA的實例。這意味着所有線程都訪問DoWorkA()上的方法,但這並不意味着該方法調用是線程安全的 - 這完全取決於DoWorkA()的實現。

DoWorkA中,您仍然需要適當的邏輯來避免可能出現的併發訪問問題,例如,使用鎖定或線程安全集合等

+0

如果DoWorkA()僅適用於本地變量(在DoWorkA()的範圍內)而不是類成員使其線程安全,那麼它是否足夠?我仍然需要使用鎖嗎? – devanalyst

1

會不會有任何線程或「重疊」問題

這取決於什麼呢//some logic。每個調用將共享相同的實例,因此DoWorkA需要線程安全才能正常工作。

//some logic內使用的任何數據都需要適當的同步才能保證安全。

+0

'classA'的構造函數也存在潛在的競爭條件 –

+0

@ConradFrix構造函數保證只能由C#規範調用一次。如果ClassA在其構造函數中使用了共享/靜態數據,而這本身並不安全,唯一的方法就是出現競爭條件。 –

相關問題