我想知道何时需要使用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。