我想知道何时需要使用threadlocal变量吗?我有一个运行多个线程的代码,每个代码读取S3上的一些文件,我希望始终跟踪从文件中读取多少行,这是我的代码:

final AtomicInteger logLineCounter = new AtomicInteger(0);
for(File f : files) {
   calls.add(_exec.submit(new Callable<Void>() {
    @Override
    public Void call() throws Exception {
       readNWrite(f, logLineCounter);
       return null;
    }
    }));
}
for (Future<Void> f : calls) {
   try {
      f.get();
   } catch (Exception e) {
      //
   }
}
LOGGER.info("Total number of lines: " + logLineCounter);
...

private void readNWrite(File f, AtomicInteger counter) {
    Iterator<Activity> it = _dataReader.read(file);

    int lineCnt = 0;
    if (it != null && it.hasNext()) {
       while(it.hasNext()) {
         lineCnt++;
         // write to temp file here

       }
       counter.getAndAdd(lineCnt);
    }
}

我的问题是我需要在lineCnt方法中将readNWrite()设置为threadlocal吗?

最佳答案

不,您不需要在这里使用ThreadLocal-您的代码看起来非常好:

  • lineCnt是一个局部变量,因此不会在线程之间共享=>它是线程安全的
  • counter.getAndAdd(lineCnt);是原子和线程安全操作

  • 如果您有兴趣,可以在SO上找到有关使用ThreadLocal的几篇文章,例如this one

    10-07 23:41