1

過去数日間、次の答えを見つけようとしていますが、包括的な答えを見つけることができませんでした

問題文

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 アプリケーションがクラスター化された環境にデプロイされている場合、同じシナリオはどのように処理されますか?

4

3 に答える 3

1

java.util.concurrent パッケージ内のものをチェックアウトします。

cuncurrent キューを使用して更新をプッシュし、アプリケーションの開始時に生成したスレッドを反対側に配置して、ファイル システムへの書き込みを行うことができます。

これにより、そのファイルへのアクセスが適切かつ効率的にシリアル化されます。

于 2010-05-31T10:37:55.443 に答える
1

より細かいレベルで同期し、ファイルの作成により密接に結び付いたオブジェクトを選択します。

FileManagerたとえば、上記をクラスに抽象化し、その単一のインスタンスをロック オブジェクトで同期させます (内部で保持されますFileManager。おそらくそれ自体でロックできます)。

そうすれば、より細かいレベルで同期を制御でき、ロックしているオブジェクトをより詳細に制御できます。それらは、サーブレット/Web コンテナーによって制御されません。

于 2010-05-31T10:33:44.140 に答える
0

JSP がどのように管理されているかの詳細を喜んで無視できるように、それを同期メソッドに入れてみませんか?

于 2010-05-31T10:37:23.647 に答える