如果在实现Runnable:的类中有一个log4j记录器
MyTask implements Runnable {
private static final Logger log = Logger.getLogger(MyTask.class);
...
}
如果我创建了这个Runnable
的许多实例,并将它们提交给多核机器上的ExecutorService
,在那里它们并行运行,并且它们都写入静态Logger
,这似乎存在争用的风险。更好的模式似乎是:
MyTask implements Runnable {
private final Logger log;
MyTask(String name) {
log = Logger.getLogger(name);
}
...
}
所以我的问题。。。这是一种你已经使用或认为有必要的模式吗?因为目前我只是在假设?
感谢
在多个线程之间共享静态类记录器是非常典型的。通常,记录器有一个已经同步的底层PrintStream
,因此创建多个Logger
是不必要和浪费的。