5

我正在开发 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) 其他意见?

谢谢。

4

3 回答 3

2

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

于 2011-09-29T04:56:08.833 回答
0

我还有一个建议。我想同步可以被视为一个方面,并且可以使用一些 AOP 框架来实现。这符合您不更改代码的要求。但我不是 100% 确定这一点,并为此发布了一个问题。请监视它的反应。

于 2011-09-29T06:25:26.767 回答
-1

不,BufferedWriter和FileWriter的基类是java.io.Writer,

它对每个写操作都有自己的锁定

Object java.io.Writer.lock

The object used to synchronize operations on this stream. 

尝试使 BufferedWriter bw 静态并通过静态方法引用它,因此所有写入都是通过相同的Writer对象写入文件

顺便说一句,我猜你正在发明另一个日志库......也许你可以使用 log4j 或任何类型的日志库来代替

于 2011-09-29T04:57:35.583 回答