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

jac*_*ack 5 mongodb mongodb-java mongodb-query

使用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);
Run Code Online (Sandbox Code Playgroud)

Der*_*lin 3

MongoDB Java API与其对应的唯一真正区别async是后者的方法是非阻塞的并且采用回调作为参数。这意味着您在回调中收到的内容与该方法在非异步 API 中返回的内容相同。

在这里,您使用该find方法。它返回一个“正常”迭代,因此调用forEach它不会导致多个线程。

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


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

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