過去数日間、次の答えを見つけようとしていますが、包括的な答えを見つけることができませんでした
問題文
Webフォームの送信を処理し、データをキャプチャしてファイルシステム内の同じファイルに書き込むカスタムJSPタグクラスがあります。すべての Web アプリケーションと同様に、これは同時にトリガーされる可能性があり、複数のスレッドがそれぞれの送信を処理するのではないかと心配しています (サーブレットがどのように機能するかは誰もが知っています)。
コード
synchronized (this){
final String reportFileName = "testReport.csv";
File reportDir = new File( rootCsDirectory, "reports" );
if(!reportDir.isDirectory())reportDir.mkdir();
File reportFile = new File (reportDir, reportFileName);
logReport(reportFile,reportContent.toString());
}
問題: - ファイル オブジェクトは、書き込みのために 1 つのスレッドで開くことができ、同時に別のスレッドがアクセスしようとして失敗し、例外をスローする可能性があります。jspエンジンはjspタグオブジェクトのプールを持っているので、 同期(this)が機能しないのではないかと心配しており、同期(this.getClass()) に変更する必要があります 参考:上記のコードはJSPカスタムタグクラスに配置されています。
編集:
質問 1:コードのブロックを同期 (this)または 同期 (this.getClass())で同期する必要があります。
質問 2: Web アプリケーションがクラスター化された環境にデプロイされている場合、同じシナリオはどのように処理されますか?