2013-05-09 43 views

回答

1

没关系,任何对象都足以充当存储锁定状态的地方。

但是,在任何代码审查中,这是一个强烈的红旗,暗示程序员正在考虑锁定错误的方式。在.NET中没有“锁定对象以使其线程安全”这样的事情。这个概念确实存在,这是许多学术研究的主题,称为STM或软件事务内存。但是在.NET框架中没有一点支持。

您使用锁来块代码。危险的代码可以由多个线程执行并读取或写入变量。通常在多个地方存在特定位置的源代码文件中的代码。您使用锁定来确保只有一个线程可以同时在这些特定位置执行代码。锁状态因此与代码的部分相关联,而不是对象。因此,应该需要一个专用对象来存储这些特定部分的锁定状态。你通过拥有这样一个专门的对象来表明你知道自己在做什么,而不是仅仅选择一个你正在做的事情。还强烈自我记录,使得查看锁定发生的位置变得更加容易,因为您只需搜索锁定变量的名称即可。

+0

谢谢。我知道这一点,但在编写代码时会忘记它。 – Monstieur 2013-05-09 09:41:39

+0

这并不意味着很多。一般来说,当你想要一个锁时,并不是因为你只需要一个线程运行该代码块,而是你不希望任何地方的任何代码都可以通过多个线程访问某个对象。 – 2014-06-20 22:40:39

+0

“我可以锁定一个对象,但没有其他人可以达到它”的另一个受害者。 – 2014-06-20 22:48:03

0

对于想要同步访问的对象,您可以确保所有锁定在其上的代码都在您的控制之下(因为否则,理论上可能会出现代码,不知道锁定在同一个对象上并导致死锁)。

大多数时候,你看到的专用锁对象正是因为这样的时间:如果你想修改暴露(例如,通过一个属性)的集合好习惯决定了你不能对集合本身锁定。

在这种情况下,锁定目标是private,所以如果你没有明确地向外界公开它,你很好。