2013-08-25 33 views
0

我們有這個共享列表,其中「MyObject來」代表一類其對象創建後不能被修改:共享列表<READING_ONLY_OBJECT>線程之間:單個線程是否可以安全地實例化引用相同元素的列表?

List<MyObject> fooList; 

當。新增或卸下襬臂方法(這是唯一的東西,可以改變fooList)被稱爲上fooList,fooList被鎖定(Monitor.TryEnter ...)

每個線程都可以做到這一點的同時對其進行訪問,同時還鎖定fooList:

foreach (MyObject o in fooList) 
{ 
    myList.Add(o); 
} 

foreach (MyObject o in myList) 
{ 
    Console.WriteLine(o.ToString()); 
} 

假設鎖只是爲了確保fooList在foreach迭代過程中沒有任何.add或.remove方法被調用(因此使其無效)而正確設置?

換句話說,如果fooList從程序的開始是不可變的,那麼刪除鎖可否安全?

回答

1

如果fooList確實從未在創建後被修改,那麼當您從中讀取值時不需要鎖定。這包括使用foreach

如果確實fooList創建後從未修改過,那麼爲什麼不使用ReadOnlyCollection<Foo>而不是List<Foo>。這是一個更具說明性和可執行性的創建不會更改的列表的方法。它會保護你免受名單上的未來意外突變

+0

好吧,我可能表現得很差(這裏不是一個本地英語......),但我說「如果fooList是不可變的......」只是爲了使前面的句子通過以另一種方式斷言可能相同的事物更加清楚。實際上鎖是存在的,我問他們是否存在的原因,正如我認爲的,只涉及在另一個線程的同一列表的foreach迭代過程中調用.add或.remove方法的可能性。任何進一步的澄清將不勝感激! –

+0

@CarloArnaboldi如果在htis線程或其他線程中調用Add或Remove方法,那麼列表* *不可*不可變。這將是一個非常可變的價值。在這種情況下,您需要鎖定添加,刪除和調用電話。 – JaredPar

+0

這就是我的意思,所以你說我的約束這個代碼是好的,對吧? –

相關問題