我正在使用Webmethods集成服务器。里面有一个java服务,采用静态java方法,通过使用BufferedWriter和FileWriter将数据写入日志文件(server.log)。静态方法的代码是这样的:我是否需要通过使用BufferedWriter和FileWriter将数据写入同一文件实现同步?
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());
}
}
注:
-The代码已被简化例如目的。
- 我无法更改writeLogFile方法声明和属性。这意味着,它将始终是:public static void writeLogFile。禁止这种修改:public synchronized void writeFile。
有可能writeLogFile方法可以被不同的实例调用,所以我需要确保没有两个或更多的实例在同一时间访问相同的资源(server.log)。这意味着,如果有两个实例尝试访问server.log,则其中一个实例必须等待另一个实例才能将数据写入server.log。
问题是: 我应该更改上面的代码吗?如果是这样,我需要做什么样的修改?我应该在java静态方法中实现“synchronized”吗?
@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)其它意见?
谢谢。
我不能这样做,因为我不能更改方法声明。这是一个来自webmethods的固定规则,它始终是:public static void xxx – null
@suud:'synchronized'不需要声明。您只能将其放入定义中。 –
因此,在代码里面放置一个同步的(XXX.class)块。但是我个人会尽力让作者开放。 – EJP