我一直在尋找一種能夠提供同一類的線程安全和不安全版本的模式。這個技術方面很明顯。我的猜測是希望能找到命名/接入約定等等這個.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等...我理解繼承。但爲什麼讓它成爲一個私人的,嵌套的類,並讓用戶跳過圈來實現呢?這樣做有什麼好處嗎?
感謝您的輸入。我只是試圖想象一個場景,其中的用戶希望在不知道它是線程安全的情況下接收基類。如果接收者是一個線程,它應該要求線程安全的版本,對吧?如果接收者不是,那麼爲什麼它會在意呢? – TBone 2011-04-15 14:42:58
如果您要從兩個線程訪問它,則兩者都需要使用相同的同步實例。你不能只讓接收者使用同步的實例,而主線程使用非同步的版本。因此,如果有任何對象被另一個線程訪問的機會,它應該被同步。但請看Joel的答案是否有一個潛在的問題。 – CodeNaked 2011-04-15 14:51:04
@裸 - 同意。但SyncWhatEv繼承了WhatEv。因此,可以在主線程上使用同一個SyncWhatEv實例作爲WhatEv類型,並且工作線程需要SyncWhatEv類型。只是,這是不可能的,因爲SyncWhatEv是私人的。目前線程將不得不仔細檢查IsSynchronized並拋出錯誤。 – TBone 2011-04-15 14:59:02