我在一个项目中使用线程。我正在尝试创建一个不会“破坏”数据的安全线程。我的线程在后台运行并调用另一个类的函数,我可以调用 Go 和 Go2,一个函数从列表中添加和删除。我不希望他们同时运行,下面的情况有什么区别:
static readonly object _locker1 = new object();
static readonly object _locker2 = new object();
public void Go(Object something)
{
lock (_locker1)
{
myList.add(something);
}
}
public void Go2(Object something)
{
lock (_locker2)
{
myList.Remove(something);
}
}
如果我将 Go2 替换为:
public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}
注意锁定参数。
第三种情况可以帮助我理解,假设我从另一个线程 (thread2) 调用 Go,它能否运行,因为 _locker1 被 thread2 锁定,而 Go2(具有被 thread2 锁定的 _locker 1)被调用线程 1?
static readonly object _locker1 = new object();
static readonly object _locker2 = new object();
public void Go(Object something)
{
lock (_locker1)
{
//Can I call Go2 which is locked by the same object?
Go2(something);
}
}
public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}
谁能解释传递给 lock 的值的作用?
请您参考如下方法:
很简单:如果两个锁使用同一个对象,它们就不会同时运行。在您的第一个片段中,由于 Go 和 Go2 锁定不同的对象,它们可能同时运行并做坏事。
