Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同步(anyObject)块中是否需要AtomicInteger?_Java_Multithreading - Fatal编程技术网

Java 在同步(anyObject)块中是否需要AtomicInteger?

Java 在同步(anyObject)块中是否需要AtomicInteger?,java,multithreading,Java,Multithreading,我想跟踪队列中的某个位置,该位置在synchronized块中被修改。因此,我需要一个计数器变量。通常我会使用原子整数,但我需要它吗 PriorityBlockingQueue<TfIdfScore> allScores = sharedFeatureNameToScores.get(featureName); synchronized (allScores) { AtomicInteger position = positionCounterMap.get(featur

我想跟踪队列中的某个位置,该位置在
synchronized
块中被修改。因此,我需要一个计数器变量。通常我会使用原子整数,但我需要它吗

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

synchronized (allScores) {

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

    // Do other stuff..
}
PriorityBlockingQueue allScores=sharedFeatureNameToScores.get(featureName);
已同步(所有分数){
AtomicInteger position=positionCounterMap.get(featureName);
位置:getAndAdd(1);
//做其他事情。。
}
或者我也可以使用
int
Integer
synchronized
块是否保护块内的所有操作


在本例中,
位置
所有分数
取决于相同的
特征名称

Synchronized比原子或易失性更严格。因此,您不需要在同步中使用原子

同步的

同步方法支持防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都通过同步方法完成

易变的

volatile字段表示该变量不会缓存在处理器核心/线程中。因此,每个核心/线程只有一个变量副本

原子的

java.util.concurrent.atomic包定义了支持单变量原子操作的类。所有类都有get和set方法,它们的工作方式类似于对易失性变量的读取和写入。也就是说,集合与同一变量上的任何后续get具有“发生在之前”关系。原子比较数据集方法也具有这些内存一致性特性,适用于整数原子变量的简单原子算术方法也具有这些特性


如果您正在编写所有代码(并采取适当的措施),则不需要同时使用
synchronized
和原子类型。只需确保给定映射上的所有操作及其包含的计数器在执行此操作时在同一对象上同步。。。这部分代码应该是线程安全的

另一方面,如果您担心有人会忘记同步,那么原子类型可能无法解决问题。更好的解决方案是确保映射和计数器封装良好,以减少错误的范围。(如果可以减少可以访问该状态的代码量,则可以减少需要检查线程安全性的位置数。)


同步块是否保护块内的所有操作

不一定


如果有其他代码访问或更新数据结构,并且该代码未在正确的互斥体上同步,则仍然可能存在线程安全问题;e、 g.相同的
allScores
实例。

在您的代码中,您使用两个不同的对象,使用featureName:
sharedFeatureNameToScores
positionCounterMap


为了保证代码是线程安全的,您需要确保使用相同的锁对它们进行修改(
synchronized(allScores)
)。一旦满足此要求,就无需使用AtomicInteger,因为同步块可保护这两个对象,因此可以在独占模式下访问
positionCounterMap

谢谢!我认为人口增加可能是一个好主意——我必须检查是否有必要,但这是一件好事,要记住,为未来!
synchronized(foo)
块不保护任何对象,但同时在同一对象上同步的其他线程除外。您可以使用该功能来保护数据,方法是确保除了从
synchronized(foo)
块中访问数据外,任何线程都不会访问数据。