私はWebmethodsIntegrationServerに取り組んでいます。内部には、BufferedWriterとFileWriterを使用してログファイル(server.log)にデータを書き込むための静的Javaメソッドの形式のJavaサービスがあります。静的メソッドコードは次のようになります。
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 staticvoidwriteLogFile。この種の変更は禁止されています:publicsynchronizedvoidwriteLogFile。
writeLogFileメソッドが異なるインスタンスによって呼び出される可能性があるため、2つ以上のインスタンスが同時に同じリソース(server.log)にアクセスしないようにする必要があります。つまり、2つのインスタンスがserver.logにアクセスしようとした場合、一方のインスタンスは別のインスタンスがserver.logへのデータの書き込みを完了するのを待つ必要があります。
質問は次のとおりです。上記のコードを変更する必要がありますか?もしそうなら、私はどのような変更を行う必要がありますか?java staticメソッド内に「同期」を実装する必要がありますか?
@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)他の意見?
ありがとう。