1
35
锁知道是哪个线程锁的。如果同一个线程再次出现,它只会增加一个计数器,而不会阻塞。 所以,在递归中,第二个调用也会进入——锁在内部增加锁计数器——因为它是同一个线程(它已经持有锁)。 MS-HELP://ms.vscc.v90/ms.msdnqtr.v90.en/dv_csref/html/656da1a4-707e-4ef6-9c6e-6d13b646af42.htm 或MSDN: http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx 国家:
注意线程引用和对“另一个”线程的强调。 |
2
34
请做 不是 锁定字符串对象。这可能会导致意外行为,如应用程序中的死锁。您当前正在锁定空字符串,这更糟。整个程序集使用相同的空字符串。更糟糕的是,作为优化,clr在appdomains上重用字符串。锁定字符串意味着您可能正在进行跨域锁定。 使用以下代码作为锁定对象:
更新
事实上,我认为可以肯定地说,允许锁定任何东西是.NET框架中的一个主要设计缺陷。相反,他们应该创造某种
|
3
9
正如其他人已经注意到的,锁是由线程固定的,因此可以工作。不过,我想补充一点。 Joe Duffy 一位来自微软的并发专家,有很多关于并发的设计规则。他的设计规则之一是:
( source ) 要防止递归锁,请将代码重写为以下内容:
而且,你的代码会抛出
|
4
6
锁属于当前线程。递归调用也在当前线程上进行。如果 另一根线 试图获取锁,它会阻塞。 |
5
1
如果你问堆栈溢出异常-那是因为里面没有什么东西可以从递归中分离出来。堆栈空间通常只有几个K,您将很快耗尽空间。 现在,本例中的锁可用于序列化调用的输出,以便如果从两个不同的线程调用recurseSome,您将看到第一个线程的整个列表,然后是第二个线程的整个列表。如果没有锁,两个线程的输出将交错。 通过拆分方法,可以在不递归获取锁的情况下获得相同的结果:
这实际上会有更好的表现,因为获取和释放锁很快,但不是免费的。 |
6
0
这和锁无关。检查递归代码。停止递归的边界条件在哪里? |
7
0
这是一个连续循环,因为无法确定何时停止递归,并且线程试图访问的对象始终被阻止。 |
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
Dansih · .Net核心自定义身份验证方案 2 年前 |
lolorekkk · 面板插入。NET WinForm 2 年前 |