【问题标题】:Does MongoCollection.forEach need to be thread safe?MongoCollection.forEach 是否需要线程安全?
【发布时间】:2016-05-08 19:17:17
【问题描述】:

使用 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);

【问题讨论】:

    标签: mongodb mongodb-query mongodb-java


    【解决方案1】:

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

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

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


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

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

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 2010-11-06
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2012-08-21
      相关资源
      最近更新 更多