我有一個屬性未受保護的訪問成員的財產得到
public ObservableCollection<string> Name
{
get
{
return _nameCache;
}
}
_nameCache由其他類中的方法多線程更新。更新由鎖保護。問題是:我應該在我的return語句中使用相同的鎖嗎?不會使用鎖導致競爭狀態?
我有一個屬性未受保護的訪問成員的財產得到
public ObservableCollection<string> Name
{
get
{
return _nameCache;
}
}
_nameCache由其他類中的方法多線程更新。更新由鎖保護。問題是:我應該在我的return語句中使用相同的鎖嗎?不會使用鎖導致競爭狀態?
這取決於你的意思是已更新。
如果您的意思是修改了參考文獻,即_nameCache = newvalue;
,那麼正如馬克所說的,是的,您應該(使用相同的鎖)和不,您不會得到競爭條件。
但是,如果您的意思是將項目添加到_nameCache所引用的實例中並將其移除,那麼您將不需要鎖定返回值(因爲參考本身不會更改)。但是,在獲取它之後,您必須小心如何閱讀集合 - 理想情況下,您應該在調用其任何方法之前使用同一個鎖。
要麼是這樣,要麼您可以使用事件模型來通知新項目等,如果您只需要跟蹤更改 - 因爲事件將在當前鎖定集合的線程上引發。
如果這不適合(因爲您總是通過索引器或其他方式獲取元素),那麼您始終可以通過此屬性返回ObservableCollection的副本 - 即return new ObservableCollection<string>(_nameCache);
。這將使屬性的返回值短暫存在,但讓所有調用者可以自由地枚舉和索引,而不用擔心來自其他線程的狀態損壞。
是的,你應該。如果您不添加鎖,那麼可能不會返回最新的_nameCache值。
public ObservableCollection<string> Name
{
get
{
lock (_yourLockObject)
{
return _nameCache;
}
}
}
是的,你可以使用同一個鎖對象。我假設你有一個變量被聲明爲如下的鎖:private object _lock = new object();
如果是這樣,你可以像下面的代碼塊一樣使用_lock對象。
public ObservableCollection<string> Name
{
get
{
lock(_lock)
{
return _nameCache;
}
}
}
如果您沒有實現在多個線程apptempting訪問_nameCache您可能會收到這不是當前呼叫此屬性格式的範圍內的值的情況下鎖定。因此,如果多線程正在訪問相同類的成員,例如上面列出的Propery,則它必須實施同步(鎖)。
享受!