|
|
1
21
我认为在上面的片段中有一个种族条件可能导致
在本地同步也不错 本身 . 真正的问题是:
|
|
|
2
4
Stephen C的答案有问题,他毫无意义地输入了许多同步锁,奇怪的是,格式化它的更好方法是:
获取同步锁有时可能需要一段时间,如果它被持有,就会发生一些变化。这可能改变了当时FOO的需要处理状态。 如果不需要处理对象,则不希望等待锁。在获得锁之后,它可能仍然不需要处理。因此,尽管看起来有点愚蠢,新手程序员可能倾向于取消其中一项检查,但只要foo.needsprocessing()是一个可忽略的函数,这实际上是一种很好的方法。 回到主要问题,当您希望基于数组中的本地值进行同步时,因为时间是关键的。在这些情况下,您最不想做的就是锁定数组中的每一项,或者处理数据两次。只有当有几个线程在做大量工作时,您才会同步本地对象,并且应该很少需要接触相同的数据,但可能非常好。 只有当且仅当处理需要处理的foo会导致并发错误时,才能执行此操作。在这些情况下,当您只想基于数组中的精确对象进行同步时,基本上需要使用双选通语法。这样可以防止对foo进行双重处理并锁定不需要处理的foo。 您只剩下很少的情况来阻塞线程,甚至只在重要的时候输入锁,而您的线程只在不阻塞会导致并发错误的地方被阻塞。 |
|
|
3
2
IDE应该帮助你,如果它出错了,你不应该弯腰去取悦它。 您可以在Intellij中禁用此检查。(有趣的是,它是默认情况下在“线程问题”下启用的唯一一个。这是人们犯的最普遍的错误吗?) |
|
4
1
将循环体重构为单独的方法
|
|
|
5
1
没有一个自动智能是完美的。我认为您对局部变量进行同步的想法是非常正确的。所以也许你可以按自己的方式来做(这是正确的),并建议JetBrains调整他们的检查。 |
|
|
6
0
在集合中的对象上进行同步没有任何问题。您可以尝试用普通for循环替换foreach:
甚至(这样探测器就不会在
不使用临时值来阻止
|
|
7
0
在.NET世界中,对象有时将其锁定对象作为属性。
这允许对象根据其实现发出不同的锁对象(例如,将监视器委托给基础数据库连接或其他对象)。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 10 月前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 11 月前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 11 月前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |