Совместное использование логгера между потоками одного класса - PullRequest
2 голосов
/ 29 февраля 2012

Если у меня есть log4j logger в классе, который реализует Runnable:

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 Ответ

6 голосов
/ 29 февраля 2012

Очень распространено использование статического регистратора классов среди множества потоков.Обычно регистратор имеет базовый PrintStream, который уже синхронизирован, поэтому создание более одного Logger не нужно и расточительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...