我想知道如何正确锁定类型的吸气剂List<String>.我有一个看起来像这样的静态类:
class FirstClass {
static private locker = new object();
static private List<String> _my_list;
public static List<String> my_list {
get {
lock(locker) {
return my_list;
}
}
}
private static void thread_func() {
// do something periodicaly with the list
// for example:
lock(locker){
_my_list.Add();
_my_list.RemoveAt();
...
}
}
Run Code Online (Sandbox Code Playgroud)
}
然后,我有另一个类看起来像这样:
class SecondClass {
private void thread_func() {
foreach(string s in FirstClass.my_list) {
// read every item in the list
}
}
Run Code Online (Sandbox Code Playgroud)
}
因此,第一类有一个第二类使用的公共列表.第一类定期更新一个线程中的列表,第二个类在第二个线程上以随机间隔读取列表.
这个锁定机制是否确保第一个类在第二个类读取时不会修改列表,反之亦然?
不,它没有.
所有这一切都确保了在您从属性中返回列表时不会修改列表.
由于现场访问已经保证是原子的,因此它是一个完全没用的锁.
你需要锁定整个foreach循环.
请注意,使用ReaderWriterLockSlim可以获得更好的性能,使用ConcurrentBag<T>不带任何锁定可以获得更好的性能.