我可以在 fixedThreadPool 中使用静态 LOGGER 对象吗?
Can I use static LOGGER object in fixedThreadPool?
有一个 spring-mvc 网络项目。如果用户做了一些重要的事情,应用程序必须记录日志并在服务层向用户的电子邮件发送消息(顺便说一句,用户会做很多重要的事情)。代码如下:
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 中使用静态记录器对象,会发生什么?僵局?比赛条件?还是什么都没有?
我应该将 fixedThreadPool 定义为静态还是非静态?
我认为:
如果 fixedThreadPool 是静态的并且我不调用它的 shutdown(),那么它会在 util web 项目关闭时存在。
如果 fixedThreadPool 是 not
静态的并且每个请求都可能产生一个 fixedThreadPool。最后,这个web项目会有很多无用的fixedThreadPool,可能会产生Out-Of-Memery。
这取决于日志记录框架的实现。大多数实现都是 thread-safe 但是它们也可以是阻塞的。 Log4j 是 thread-safe.
见Is SLF4J thread-safe?。
我假设你使用 org.slf4j.Logger
对吧? SLF4j 只为记录器提供一个接口。所以就像@kdowbecki 说的那样,这取决于您使用的是哪种记录器实现。例如 java.util.logging.Logger
是线程安全的...
来自 JavaDocs:
All methods on Logger are multi-thread safe.
这里 post 列出了一些示例:
Is SLF4J thread-safe?
有一个 spring-mvc 网络项目。如果用户做了一些重要的事情,应用程序必须记录日志并在服务层向用户的电子邮件发送消息(顺便说一句,用户会做很多重要的事情)。代码如下:
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 中使用静态记录器对象,会发生什么?僵局?比赛条件?还是什么都没有?
我应该将 fixedThreadPool 定义为静态还是非静态?
我认为:
如果 fixedThreadPool 是静态的并且我不调用它的 shutdown(),那么它会在 util web 项目关闭时存在。
如果 fixedThreadPool 是
not
静态的并且每个请求都可能产生一个 fixedThreadPool。最后,这个web项目会有很多无用的fixedThreadPool,可能会产生Out-Of-Memery。
这取决于日志记录框架的实现。大多数实现都是 thread-safe 但是它们也可以是阻塞的。 Log4j 是 thread-safe.
见Is SLF4J thread-safe?。
我假设你使用 org.slf4j.Logger
对吧? SLF4j 只为记录器提供一个接口。所以就像@kdowbecki 说的那样,这取决于您使用的是哪种记录器实现。例如 java.util.logging.Logger
是线程安全的...
来自 JavaDocs:
All methods on Logger are multi-thread safe.
这里 post 列出了一些示例: Is SLF4J thread-safe?