在我的應用程序已經寫了使用的java.util.logging使用同步而登錄
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.SimpleFormatter;
public class Logger {
public final static String PROPERTIES_FILE = "Logger.properties";
private static java.util.logging.Logger logger = null;
private static void initialize() {
try {
logger = java.util.logging.Logger.getLogger(Logger.class.getName());
FileHandler fh = new FileHandler("D:\\MyLogFile.log", true);
logger.addHandler(fh);
logger.setLevel(Level.ALL);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
logger.log(Level.INFO, "Test Message Logged");
}
catch (IOException e) {
System.out.println("Warning: Unable to read properties file " +
PROPERTIES_FILE);
}
}
public static synchronized java.util.logging.Logger getLogger(String name)
{
if(logger==null)
{
Logger.initialize();
}
logger.getLogger(name);
return logger;
}
}
我自己的日誌記錄工具是否需要使用同步進行getLogger方法?請提出您的意見。 (此代碼在多線程環境中運行)
正如ykaganovich引用的[double-checked locking](http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)文章中指出的那樣,他給雙重檢查日誌記錄的例子只適用於Java 5或後來。在Java 5之前,由於JVM可以在處理器之間分配線程,所以[無法避免synchronized關鍵字](http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) (和它們的本地內存緩存)。一般來說,我同意在可能的情況下,單例的靜態初始化是最好的。 – 2012-04-17 02:32:32