如果我在实现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);
}
...
}
所以我的问题......这是你在我纯粹假设时所使用或发现的必要模式吗?
由于
答案 0 :(得分:6)
在许多线程中共享静态类记录器是非常典型的。通常,记录器具有已经同步的基础PrintStream
,因此创建多个Logger
是不必要且浪费的。