java多线程和静态方法

时间:2012-10-12 14:37:22

标签: java

我有一个java应用程序。我正在使用日志格式化程序对象。所有日志消息都应具有此对象。例如

log.debug(new LogFormatter(x,y,z))

但我必须创建新的LogFormatter对象以及我要记录的所有内容。如果我使用静态方法,例如

log.debug(LogFormatter.format(x,y,z))

我不必创建新对象。但在多线程应用程序中它会正常工作。

如果两个线程使用diff值调用,那么日志记录就会搞乱。

或者是本地线程最好的方式

4 个答案:

答案 0 :(得分:1)

这取决于记录器的实现。如果您将使用本机Java类,那么您应该使用方法的synchronize关键字或处理日志插入的代码部分来处理锁。

IMO我建议使用像Log4J这样的线程安全的日志库:

请注意,某些Java应用程序服务器(如JBoss和GlassFish)使用Log4j来处理日志记录工作。

答案 1 :(得分:1)

我会用

private final LogFormatter logFormatter; // immutable object.

log.debug(logFormatter.format(x,y,z))

由于格式化程序是不可变的,因此可以共享。

答案 2 :(得分:0)

这取决于两件事:

  1. LogFormatter.format(x,y,z)方法是否是线程安全的。
  2. 您的记录器实现是否是线程安全的。
  3. 如果这两个条件都成立,那么您可以在多线程环境中使用您的方案,并且不会出现错误。

    具体来说,您的记录器实现应该是线程安全的,因为它同步对底层输出机制的访问:例如,通过确保一次只打印一个日志记录。

答案 3 :(得分:0)

为了避免仅在启用日志记录时线程之间的同步,我习惯于为每个线程关联一个日志链。 难点是将几个文件连接到 - 离线 - 了解正在发生的事情。 每行日志都有一个日期和一个线程ID。

相关问题