Mongodb MongoCollection.forEach是否需要线程安全?

Mongodb MongoCollection.forEach是否需要线程安全?,mongodb,mongodb-query,mongodb-java,Mongodb,Mongodb Query,Mongodb Java,使用MongoDB异步Java驱动程序时: 下面的回调是否需要使用AtomicInteger计数器,或者正常的int是否可以完成此任务 Block<Document> theBlock = new Block<Document>() { AtomicInteger counter = new AtomicInteger(); @Override public void apply(final Document document) { counter

使用MongoDB异步Java驱动程序时: 下面的回调是否需要使用AtomicInteger计数器,或者正常的int是否可以完成此任务

Block<Document> theBlock = new Block<Document>() {
  AtomicInteger counter = new AtomicInteger();
  @Override
   public void apply(final Document document) {
     counter.incrementAndGet();
   }
 };
SingleResultCallback<Void> callbackWhenFinished = ...

collection.find().forEach(theBlock, callbackWhenFinished);
Block theBlock=新块(){
AtomicInteger计数器=新的AtomicInteger();
@凌驾
公开作废申请(最终文件){
counter.incrementAndGet();
}
};
SingleResultCallback callbackWhenFinished=。。。
collection.find().forEach(块,完成时回调);

MongoDB Java API和它的
异步
对等体之间唯一的真正区别在于后者的方法是非阻塞的,并将回调作为参数。这意味着您在回调中接收的内容与该方法在非异步API中返回的内容等效

在这里,您使用
find
方法。它返回一个“普通”iterable,因此对其调用
forEach
不会导致多个线程

换句话说,您不需要
原子整数
:您的
apply
方法由同一线程顺序调用


如果您仍有疑问或需要“证明”,您可以执行以下操作之一:

  • 添加一个
    System.out.println(Thread.currentThread().getName())在你的区块内。您将看到它总是由同一个线程执行
    
  • 在块内添加断点,配置为仅停止线程。断点将再次阻塞整个代码