我想跟踪在 synchronized
block 中修改的队列中的位置。因此我需要一个计数器变量。通常我会使用 AtomicInteger
但我在这里需要它吗?
PriorityBlockingQueue<TfIdfScore> allScores = sharedFeatureNameToScores.get(featureName);
synchronized (allScores) {
AtomicInteger position = positionCounterMap.get(featureName);
position.getAndAdd(1);
// Do other stuff..
}
或者我也可以使用 int
或 Integer
吗? synchronized
block 是否保护我在 block 内的所有操作?
在此示例中,position
和 allScores
依赖于相同的 featureName
。
最佳答案
如果您正在编写所有代码(并采取适当的措施),那么您不需要同时使用 synchronized
和原子类型。只需确保给定 map 上的所有操作及其包含的计数器在执行该操作时在同一对象上同步......并且该部分代码应该是线程安全的。
另一方面,如果您担心有人会忘记同步,那么原子类型可能无法解决问题。更好的解决方案是确保 map 和计数器封装良好,以减少出错的范围。 (如果可以减少可以访问状态的代码量,就会减少需要检查线程安全的地方的数量。)
Does the synchronized block protect all my actions inside the block?
不一定。
如果有其他代码访问或更新数据结构,并且那些代码没有在正确的互斥锁上同步,您仍然会遇到线程安全问题;例如相同的 allScores
实例。
关于java - 我需要在 synchronized(anyObject) block 中使用 AtomicInteger 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30460875/