2011-02-07 82 views
1

我有一個對象,它服務於多個請求(線程)...思考跨多個線程的SqlConnection對象...我可以使用ContextBoundObject創建線程安全對象嗎?

現在,我想創建一個「線程」安全對象,它知道線程上下文其中它是創建的

所以,如果線程1創建對象foo及線程試圖訪問它....對象foo會忽略它,只有「行爲」,如果線程1正在運行...

威爾ContextBoundObject這樣做呢?如果是的話,它有什麼限制?

僞代碼,你想達到

public class Foo 
{  
    private int _threadId; 

    public void DoSomething() 
    { 
     (if thread.ManagedThreadId != _threadId) return; 

     // Do some thread safe stuff 
    } 

} 
+1

在進入如何做到這一點之前?你能否提供你爲什麼要這樣做的細節?也許有更好的解決方案來實現你正在尋找的東西。 – 2011-03-05 00:51:51

+0

我想這樣做是因爲我想要「線程安全」的實例......包括方法調用和屬性訪問。 我不相信「此對象對於多線程訪問不安全」。 – 2011-03-07 08:05:29

回答

0

行爲可以通過SynchronizationAttribute進行。

但是,使用此屬性將序列化訪問類的所有成員。另一方面,如果類的某些方法不需要同步(如不共享任何狀態的靜態方法),則使用「同步」屬性可能會導致性能下降。

0

是的,您可以通過實現ContextBoundObject並使用Synchronization屬性註釋類來實現線程安全。然而,只有當你想要類級別鎖定時(即所有方法/屬性等),建議這樣做,並且由於有時它容易發生死鎖和較差的併發性。

在只有少數方法需要鎖定的情況下,更好的解決方案是使用鎖定關鍵字進行手動鎖定,鎖定關鍵字是抽象的,輕量級的,並且不會受到死鎖的影響。

希望這有助於!

相關問題