我想跟踪队列中某个位置的位置,该位置在synchronized
块内被修改。因此,我需要一个计数器变量。通常我会用,AtomicInteger
但是我在这里需要吗?
PriorityBlockingQueue<TfIdfScore> allScores = sharedFeatureNameToScores.get(featureName);
synchronized (allScores) {
AtomicInteger position = positionCounterMap.get(featureName);
position.getAndAdd(1);
// Do other stuff..
}
或者,我可以使用int
或Integer
作为呢?是否synchronized
块保护我所有的块内的行动?
在此示例中position
并allScores
依赖相同featureName
。
如果您正在编写所有代码(并采取适当的措施),则无需同时使用synchronized
原子类型和原子类型。只要确保给定映射上的所有操作及其包含的计数器在执行此操作时就在同一对象上进行同步...并且代码的那部分应该是线程安全的。
另一方面,如果您担心有人会忘记同步,那么原子类型可能无法解决问题。更好的解决方案是确保对映射和计数器进行正确封装,以减少错误的范围。(如果可以减少可访问状态的代码量,则可以减少检查线程安全性所需的位置。)
同步块是否保护我在该块内的所有动作?
不必要。
如果还有其他代码正在访问或更新数据结构,并且该代码未在正确的互斥锁上进行同步,则仍然可能存在线程安全问题。例如同一个allScores
实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句