我仍然很困惑......当我们写这样的东西时:
Object o = new Object();
var resource = new Dictionary<int , SomeclassReference>();
...并且有两个锁定的代码块o
访问时resource
...
//Code one
lock(o)
{
// read from resource
}
//Code two
lock(o)
{
// write to resource
}
现在,如果我有两个线程,其中一个线程执行读取的代码resource
另一个写信,我想锁定resource
这样,当它被读取时,作者将不得不等待(反之亦然 - 如果正在写入,读者将不得不等待)。锁结构对我有帮助吗? ...或者我应该使用其他东西吗?
(我在用着Dictionary
出于本示例的目的,但可以是任何内容)
有两种情况是我特别关心的:
- 两个线程尝试执行同一行代码
- 两个线程尝试在同一资源上工作
Will lock
在这两种情况下都有帮助吗?
大多数其他答案都针对您的代码示例,因此我将尝试回答标题中的问题。
锁实际上只是一个令牌。可以说,谁拥有令牌就可以上台。因此,您锁定的对象与您尝试同步的资源没有显式连接。只要所有读者/作者都同意同一个标记,它就可以是任何东西。
当尝试锁定一个对象时(即通过调用Monitor.Enter
在对象上)运行时检查锁是否已被线程持有。如果是这种情况,尝试锁定的线程将被挂起,否则它将获取锁定并继续执行。
当持有锁的线程退出锁范围时(即调用Monitor.Exit
),锁被释放,任何等待的线程现在都可以获取锁。
最后,关于锁,需要记住以下几点:
- 只要您需要就可以锁定,但不再需要锁定。
- 如果你使用
Monitor.Enter/Exit
而不是lock
关键字,请务必调用Exit
in a finally
阻塞,因此即使在发生异常的情况下锁也会被释放。
- 公开要锁定的对象使得更难了解谁在锁定以及何时锁定。理想情况下,同步操作应该被封装。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)