在同一个类的线程之间共享记录器

时间:2012-02-29 19:23:01

标签: java multithreading logging concurrency

如果我在实现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);
  }
  ...
}   

所以我的问题......这是你在我纯粹假设时所使用或发现的必要模式吗?

由于

1 个答案:

答案 0 :(得分:6)

在许多线程中共享静态类记录器是非常典型的。通常,记录器具有已经同步的基础PrintStream,因此创建多个Logger是不必要且浪费的。