2011-04-15 64 views
5

我一直在尋找一種能夠提供同一類的線程安全和不安全版本的模式。這個技術方面很明顯。我的猜測是希望能找到命名/接入約定等等這個.Net模式的好處是什麼

所以我在「Systems.Collections」命名空間到處找這種模式:

public class WhatEv 
{ 
    private class SyncWhatEv : WhatEv 
    { 
     // overrides IsSyncronized = true 
     // overrides whatever else to make it thread safe 
    } 

    public virtual bool IsSynchronized 
    { 
     get { return false; } 
    } 

    public static WhatEv Synchronized(WhatEv whatEv) 
    { 
     return new SyncWhatEv(whatEv); 
    } 
} 

有許多的實現這個類: HashTable,Queue,ArrayList,Stack等...我理解繼承。但爲什麼讓它成爲一個私人的,嵌套的類,並讓用戶跳過圈來實現呢?這樣做有什麼好處嗎?

+0

感謝您的輸入。我只是試圖想象一個場景,其中的用戶希望在不知道它是線程安全的情況下接收基類。如果接收者是一個線程,它應該要求線程安全的版本,對吧?如果接收者不是,那麼爲什麼它會在意呢? – TBone 2011-04-15 14:42:58

+0

如果您要從兩個線程訪問它,則兩者都需要使用相同的同步實例。你不能只讓接收者使用同步的實例,而主線程使用非同步的版本。因此,如果有任何對象被另一個線程訪問的機會,它應該被同步。但請看Joel的答案是否有一個潛在的問題。 – CodeNaked 2011-04-15 14:51:04

+0

@裸 - 同意。但SyncWhatEv繼承了WhatEv。因此,可以在主線程上使用同一個SyncWhatEv實例作爲WhatEv類型,並且工作線程需要SyncWhatEv類型。只是,這是不可能的,因爲SyncWhatEv是私人的。目前線程將不得不仔細檢查IsSynchronized並拋出錯誤。 – TBone 2011-04-15 14:59:02

回答

-1

在週末考慮了這件事後,沒有得到進一步的答覆。我已經決定了答案是:MS你們都瘋了。提供對象的同步版本的整個目的是爲了線程安全,但是線程在編譯時無法要求線程安全版本的對象。這個對象的驗證必須在運行時發生,這是......假的。

感謝大家的意見。我很感激。

3

在大多數情況下,不需要該對象的線程安全版本(即Hashtable,Queue)。因此,添加所需的開銷以使其在默認情況下爲線程安全是沒有意義的。使用Synchronized方法,允許需要線程安全性的用戶獲得線程安全版本。

該對象的同步版本不會添加任何其他功能,而不是線程安全性。他們不暴露任何新成員,也不知道他們的基礎類型真的有幫助。所以他們變得私人化,簡單地「看起來」像他們的公共/基礎班。

+0

如果您要花費創建線程安全版本,爲什麼不放棄非threasafe版本,只維護一個版本? – BenCr 2011-04-15 14:26:27