我正在开发 Webmethods 集成服务器。里面有一个 java 服务,它采用静态 java 方法的形式,用于使用 BufferedWriter 和 FileWriter 将数据写入日志文件 (server.log)。静态方法代码是这样的:
public static void writeLogFile(String message) throws ServiceException{
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
bw.write(message);
bw.newLine();
bw.close();
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
}
注意:
-出于示例目的,代码已被简化。
- 我无法更改 writeLogFile 方法声明和属性。这意味着,它将永远是:public static void writeLogFile。禁止这种修改:public synchronized void writeLogFile。
writeLogFile 方法有可能被不同的实例调用,所以我需要确保没有两个或多个实例同时访问相同的资源(server.log)。这意味着,如果有两个实例尝试访问 server.log,其中一个实例必须等待另一个实例完成将数据写入 server.log。
问题是:我应该更改上面的代码吗?如果是这样,我需要做什么样的修改?我应该在 java 静态方法中实现“同步”吗?
@EJP:
那么,下面哪一个是实现同步的最佳代码?
1)
FileWriter fw = new FileWriter("./logs/server.log", true);
synchronized (fw) {
BufferedWriter bw = new BufferedWriter(fw);
bw.write(message);
bw.newLine();
bw.close();
}
2)
BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
synchronized(bw) {
bw.write(message);
bw.newLine();
bw.close();
}
3)
synchronized(util.class) { //yes, the class name is started with lowercase
BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
bw.write(message);
bw.newLine();
bw.close();
}
4) 其他意见?
谢谢。