在網上搜尋了一下,得出以下結論:
實現乙個真正執行緒安全的list是很困難的,具體可以參考這篇why are thread safe collections so hard?。
使用concurrentbag,微軟給出的執行緒安全的集合,缺點是unordered。如果集合依賴內部元素的順序,就不太合適了。
實現乙個列舉安全的list,所需的工作量相對小很多,甚至僅需要給已用到的list操作加上lock。
以下是乙個最小化實現的列舉安全的list。因為實際工程中,需要列舉安全的集合僅用到了add,count,索引等操作,所以繼承了ienumerable介面,而不是ilist。同時也不影響使用linq to objects的擴充套件方法,真是偷了乙個大懶。
class enumerationsafelist: ienumerableienumerator ienumerable.getenumerator()
public
void
add(t item)
}public
void
remove(t item)
}public
intcount}}
public t this[int
index]
}set }
}private listclone()
}return
clonelist;
}}
**對add,remove,count和索引四個操作加了lock,同時在列舉時通過加lock並返回當前集合的副本,來避免遍歷時因為其他執行緒的修改而丟擲異常。
如果**需要list型別的全部方法,就需要進一步修改,把ienumerable改成ilist並實現介面,就可以得到乙個完整的「data thread safe list」。
完整的**及測試用的程式:**
C 多執行緒之List的執行緒安全問題
網上關於list的執行緒安全問題將的很少,所以自己實驗了一把,發現確實是執行緒不安全的.所以當你在進行多執行緒程式設計中使用了共享的list集合,必須對其進行執行緒安全處理.list的add方法是執行緒不安全的,list的原始碼中的add方法,使用了每次當當前的元素達到上限,通過建立乙個新的陣列例項...
(多執行緒)多執行緒的併發安全
多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...
多執行緒 執行緒安全
原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...