这种建设有意义吗?

Does this construction make sense?

遇到了一个使用此代码的项目:

   public class IndexUpdater implements Runnable {
        @Override
        public void run() {
            final AtomicInteger count = new AtomicInteger(0);
            FindIterable<Document> iterable = mongoService.getDocuments(entryMeta, null, "guid");
                iterable.forEach(new Block<Document>() {
                    @Override
                    public void apply(final Document document) {
                        count.incrementAndGet();
                        // A lot of code....
                        if (count.get() / 100 * 100 == count.get()) {
                            LOG.info(String.format("Processing: %s", count.get()));
                        }
                    }
                });
        }
   }

这里我感兴趣的是三行代码:

if (count.get() / 100 * 100 == count.get()) {
    LOG.info(String.format("Processing: %s", count.get()));
}

考虑到多线程和 AtomicInteger 变量的类型,这个条件有意义吗?或者这是一个毫无意义的支票? 有趣的是,IntellijIdea 并没有强调这个构造是没有意义的。

我不会称此代码为 "meaningless",而是 错误的 (或者,它可能具有意想不到的语义)。

如果以多线程方式调用它,您将不会总是在方法中的三个调用中获得相同的 count.get() 值(如果包含 count.incrementAndGet(),则有四个) .

这种 情况下,这样做的后果看起来并不是灾难性的 - 您可能会错过一些日志记录语句,并且您可能会看到一些意想不到的消息,例如 Processing 101,然后想知道为什么这个数字不是 100 的倍数。但也许如果你在其他地方采用相同的结构,会有更重要的影响。

count.incrementAndGet()的结果放入一个变量(*)中,以便以后使用。

但是,使用 count.get() % 100 == 0 也会更容易:

int value = count.incrementAndGet();
// A lot of code....
if (value % 100 == 0) {
  LOG.info(String.format("Processing: %s", value));
}

这是正确的(或者,它可能是预期的)并且更容易阅读。


(*) 根据您实际希望通过此日志消息显示的内容,您可能希望将 count.incrementAndGet() 放在 "A lot of code" 之后。