|
|
1
3
您的代码不是线程安全的。由于您没有锁定第一个TryGetValue,因此线程可能会在修改字典(使用Add)时尝试访问字典。在当前的.Net字典实现中,如果正在修改基础字典,TryGetValue可能会引发异常。 您最好完全转储外部TryGetValue,或者使用ReaderWriterLockSlim。 要回答您的问题,可能是因为您没有从调用代码访问您的单例(实例)?无论如何,不要使用这种锁定策略,它很脆弱。使用ReaderWriterLockSlim或转储第一个TryGetValue。 |
|
|
2
1
这里有一个可怕的想法:我只在调试模式下为lock()生成的代码中遇到了公认的MS bug 3.5sp1 CLR(如果您感兴趣,我将尝试查找)。我发现在调试会话期间,我将有两个线程在lock()语句中执行代码——这不太好。您可以通过在lock()中使用包含 interlocked 在int上递增/递减。如果该联锁变量超过1,我将调用debugger.break()。您还可以创建另一个变量,该变量在锁定之前递增,然后在锁定内部立即递减(再次使用联锁增量)。这些变量将显示等待锁的线程数以及lock()语句本身中当前执行代码的线程数 祝你好运 |
|
3
0
我建议添加锁 之前 if语句。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 2 年前 |
|
|
András Takács · Python多线程错误 2 年前 |