我可以在fixedThreadPool中使用静态LOGGER对象吗? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

有一个spring-mvc web项目。如果用户做了重要的事情,应用程序必须记录日志并在服务层中向用户的电子邮件发送消息(顺便说一句,用户将做许多重要的事情)。代码如下:

private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class);

private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

fixedThreadPool.execute(new Runnable() {
    @Override
    public void run() {
        if (emailParams != null && EmailUtil.sendEmail(emailParams)) {
            LOGGER.info("send email succeed");
        } else {
            LOGGER.warn("send email failed");
        }
    }
});

我遇到了两个问题:

  1. 我可以在fixedThreadPool中使用静态LOGGER对象吗? 如果我在fixedThreadPool中使用静态logger对象,会发生什么?僵局?比赛条件?或无?
  2. 我应该定义fixedThreadPool静态还是非静态? 在我看来: 如果fixedThreadPool是静态的并且我没有调用它的shutdown(),那么它将存在util web project is shutdown。 如果fixedThreadPool是not静态,并且每个请求都可能产生一个fixedThreadPool。最后,这个web项目将有许多无用的fixedThreadPool,可能会产生Out-Of-Memery。
java spring-mvc threadpool slf4j
2个回答
1
投票

它取决于日志框架实现。大多数实现都是线程安全的,但它们也可能是阻塞的。 Log4j是线程安全的。

Is SLF4J thread-safe?


0
投票

我假设你使用org.slf4j.Logger吧? SLF4j仅为记录器提供接口。所以像@kdowbecki说的那样取决于你正在使用哪种记录器实现。例如java.util.logging.Logger是线程安全的...

来自JavaDocs:

Logger上的所有方法都是多线程安全的。

这是一个列出一些例子的帖子:Is SLF4J thread-safe?

© www.soinside.com 2019 - 2024. All rights reserved.