在一个项目我正在玩线程.我试图建立一个不会"破坏"数据的安全线程.我的线程在后台运行,并在另一个类上调用函数,我可以调用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)是从thread1调用的?
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); } }
有人可以解释传递给锁的值是什么吗?
这很简单:如果两个锁使用相同的对象,它们将不会同时运行.在你的第一个片段中,当Go和Go2锁定在不同的对象上时,它们可以同时运行并做坏事.