This question already has answers here:
Is SLF4J thread-safe?
                            
                                (2个答案)
                            
                    
                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");
        }
    }
});


我遇到了两个问题:


我可以在fixedThreadPool中使用静态LOGGER对象吗?

如果我在fixedThreadPool中使用静态记录器对象,会发生什么?僵局?比赛条件?或无?
我应该将staticThreadPool定义为静态还是非静态?

在我看来:

如果fixedThreadPool是静态的,并且我不调用其shutdown(),则它将存在util Web项目为shutdown。

如果fixedThreadPool是not静态的,并且每个请求都可以产生一个fixedThreadPool。最后,此Web项目将有许多无用的fixedThreadPool,可能会产生Me-Memery。

最佳答案

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

请参见Is SLF4J thread-safe?

关于java - 我可以在fixedThreadPool中使用静态LOGGER对象吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49127711/

10-08 23:03