我想知道如何正确锁定 List<String>
类型的 getter .我有一个看起来像这样的静态类:
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();
...
}
}
然后,我有另一个看起来像这样的类:
class SecondClass {
private void thread_func() {
foreach(string s in FirstClass.my_list) {
// read every item in the list
}
}
所以,第一类有第二类使用的公共(public)列表。第一类在一个线程中定期更新列表,第二类在第二个线程中以随机间隔读取列表。
这种锁定机制是否确保列表不会在第二个类读取时被第一个类修改,反之亦然?
最佳答案
不,不是。
唯一能确保的是列表在您从属性返回时不会被修改。
由于字段访问已保证是原子的,因此它是一个完全无用的锁。
您需要对整个 foreach
加锁环形。
请注意,使用 ReaderWriterLockSlim 可以获得更好的性能,使用 ConcurrentBag<T>
可以获得更好的性能。没有任何锁。
关于c# - 如何在 C# 中正确锁定 List<String> getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929933/