java - 我需要在 synchronized(anyObject) block 中使用 AtomicInteger 吗?

标签 java multithreading

我想跟踪在 synchronized block 中修改的队列中的位置。因此我需要一个计数器变量。通常我会使用 AtomicInteger 但我在这里需要它吗?

PriorityBlockingQueue<TfIdfScore> allScores = sharedFeatureNameToScores.get(featureName);

synchronized (allScores) {

    AtomicInteger position = positionCounterMap.get(featureName);               
    position.getAndAdd(1);

    // Do other stuff..
}

或者我也可以使用 intInteger 吗? synchronized block 是否保护我在 block 内的所有操作?

在此示例中,positionallScores 依赖于相同的 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/

相关文章:

java - 如何在 Java Swing 中抓取鼠标?

python - Pypy 的无堆栈线程选项支持并行执行吗?

multithreading - JBoss EAP中的JSR-236并发实用程序支持

c++ - 没有互斥锁的基于模数的负载平衡?

java - 在 Netbeans 中将 JDialog 转换为 JPanel

java - 循环连接四个网格

java - 无法为 Android 运行 Espresso 测试

java - 有什么方法可以生成数据库的 POJO?

c# - (无效的方法)避免在 C# 中双重检查锁

php - 如何使用 PHP 的 curl 库并行下​​载文件的多个部分?