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

Scr*_*ers 2 java concurrency logging multithreading

如果我在实现Runnable的类中有一个log4j记录器:

MyTask implements Runnable {
  private static final Logger log = Logger.getLogger(MyTask.class);
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果我创建了许多这样的实例Runnable并将它们提交到ExecutorService多核机器并且它们并行运行,并且它们都写入静态Logger,那么这似乎存在争用的风险.一个更好的模式似乎是:

MyTask implements Runnable {
  private final Logger log;
  MyTask(String name) {
    log = Logger.getLogger(name);
  }
  ...
}   
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Gra*_*ray 6

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