作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道使用 lock(this)
或任何共享对象是错误的。
不知这样的用法可以吗?
public class A
{
private readonly object locker = new object();
private List<int> myList;
public A()
{
myList = new List<int>()
}
private void MethodeA()
{
lock(locker)
{
myList.Add(10);
}
}
public void MethodeB()
{
CallToMethodInOtherClass(myList);
}
}
public class OtherClass
{
private readonly object locker = new object();
public CallToMethodInOtherClass(List<int> list)
{
lock(locker)
{
int i = list.Count;
}
}
}
这个线程安全吗?在 OtherClass
中,我们用一个私有(private)对象锁定,所以如果 class A
锁定了它的私有(private)锁,列表仍然可以在 OtherClass
的锁 block 中改变>?
最佳答案
不,它不是线程安全的。 Add 和 Count 可以在“同一”时间执行。您有两个不同的锁对象。
传递列表时始终锁定自己的锁对象:
public void MethodeB()
{
lock(locker)
{
CallToMethodInOtherClass(myList);
}
}
关于c# - 这个锁使用线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924500/
我是一名优秀的程序员,十分优秀!