2

私は、Javaで支柱を使用してWebアプリケーションを作成する会社で働いています。私は最近、システムを整理するために多くのコードをリファクタリングしています。私が使用している手法の1つは、メソッドのストリームの終了ステートメントを、finallyブロックでユーティリティクラスに移動することです。ユーティリティクラスは静的であり、さまざまなタイプのストリームのクローズメソッドがあります。このリファクタリングを行うことで、ストリームを閉じる必要があるたびに5行のコードを節約できます。これにより、一部のクラスのコードが600行削減され、非常に有利になりました。ただし、これを行うことで、本番環境に移行した場合にこれらのメソッドで競合が発生する可能性があるのではないかと心配しています。

私はマルチスレッドプログラミングで競合の概念に出くわしただけです。そのため、これがこれらのインスタンスで問題を引き起こすかどうかはわかりません。

これは可能ですか?または単に競合、静的メソッド、Webアプリケーションなどの私の誤解?

よろしくお願いします、アレクセイブルー。

4

3 に答える 3

2

同じスコープ内で開いているすべてのファイルハンドラーを閉じることをお勧めします。たとえば、ファイル出力ストリームがメソッドで開かれている場合、そのメソッドでも閉じられる必要があります。これにより、並行性の問題のほとんどを防ぐこともできます(常にではありません)。ただし、そうしないことには多くの例外がありますが、この場合、すべてのファイルハンドラーを追跡して閉じることはより困難になります。

参考までに、Apache Common IO、IOUtilsで説明したことを正確に実行するクロージングメソッドがあります。利用を検討してもよい人気のライブラリです。

于 2011-11-30T09:57:02.690 に答える
1

これは一般的な方法です。たとえば、GuavaのCloseablesクラスを見てください。ちなみに、Javaで事実上すべてを閉じるには、次の1つのメソッドのみが必要です。

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

すべてのストリームとリーダーがCloseableインターフェースを実装しているため、この1つの方法ですべてのニーズに対応できます。

一般に、これは、たとえばThread-Aでストリームから読み取ろうとしない限り、競合を引き起こしません。ここで、Thread-Bはストリームを閉じています。しかし、その場合は、このリファクタリングの有無にかかわらず、この競合が発生します。このリファクタリングだけでは、追加の競合は発生しません。

于 2011-11-30T09:54:59.630 に答える
1

静的メソッドがそれらのパラメーターのみで動作し、同じストリームを複数回同時に閉じようとしない限り、問題はありません。

一般に、メソッドは同時に実行できます。同期は常にオブジェクトで機能するため、これらのメソッドで使用するオブジェクトが完全に異なる場合は、競合は発生しません。

于 2011-11-30T09:49:12.200 に答える