我是否需要使用BufferedWriter和FileWriter实现将数据写入同一文件的同步?

nul*_*ull 5 java static synchronized filewriter bufferedwriter

我正在研究Webmethods Integration Server.里面有一个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());
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:
- 代码已经过简化,仅用于示例目的.
-I无法更改writeLogFile方法声明和属性.这意味着,它将永远是:public static void writeLogFile.禁止这种修改:public synchronized void writeLogFile.

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();
        }
Run Code Online (Sandbox Code Playgroud)

2)

        BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
        synchronized(bw) {
            bw.write(message);
            bw.newLine();
            bw.close();
        }
Run Code Online (Sandbox Code Playgroud)

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();
        }
Run Code Online (Sandbox Code Playgroud)

4)其他意见?

谢谢.

use*_*421 2

只需使方法同步即可。出于二进制兼容性目的,它不会影响其方法签名。