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

时间:2016-01-31 08:37:30

标签: 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.incrementAndGet();
   }
 };
SingleResultCallback<Void> callbackWhenFinished = ...

collection.find().forEach(theBlock, callbackWhenFinished);

1 个答案:

答案 0 :(得分:2)

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

在这里,您使用find方法。它返回&#34;正常&#34;可迭代的,因此在其上调用forEach将不会导致多个线程。

换句话说,您不需要AtomicInteger :您的apply方法会被同一个线程顺序调用。

如果您仍然怀疑或需要&#34;证明&#34;,您可以执行以下操作之一:

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