Java-Struts Webアプリケーションのリファクタリングメソッドは競合を引き起こしますか?
-
26-10-2019 - |
質問
JavaでStrutsを使用してWebアプリケーションを作成する会社と協力しています。私は最近、多くのコードをリファクタリングして、システムを整理しています。私が使用してきた1つの手法は、ストリームの閉鎖ステートメントを移動することです。 最後に ユーティリティクラスへの方法のブロック。ユーティリティクラスは静的で、さまざまな種類のストリームの緊密な方法があります。このリファクタリングを行うことにより、ストリームを閉じる必要があるたびに5行のコードを節約し、一部のクラスのコードを600行で削減し、非常に好ましいものにします。しかし、私はこれを行うことで、生産に入れればそれらの方法に競合を引き起こすことが可能かもしれないと心配しています。
私は、マルチスレッドプログラミングでの競合の概念に出くわしただけで、これがこれらの例で問題を引き起こすかどうかわからない理由です。
これは可能ですか?または、単に競合、静的な方法、Webアプリケーションなどの誤解を告げますか?
よろしくお願いします、アレクセイ・ブルー。
解決
静的メソッドがパラメーターのみで動作し、同じストリームを複数回閉じようとしない限り、問題はありません。
一般に、方法は同時に実行できます。同期は常にオブジェクトで機能するため、これらのメソッドで使用するオブジェクトが完全に異なる場合、競合は発生しないはずです。
他のヒント
同じ範囲内ですべてのオープンファイルハンドラーを閉じることがベストプラクティスです。たとえば、ファイル出力ストリームがメソッドで開いている場合、そのメソッドでも閉じている必要があります。また、これにより、並行性の問題のほとんどが防止されます(常にではありません)。ただし、そうしないことには多くの例外がありますが、この場合、すべてのファイルハンドラーを追跡して閉じることはより困難です。
参考までに、apache common ioで説明していることを正確に行う閉鎖方法が存在します。 ioutils. 。これは、使用することを検討することができる人気のライブラリです。
これは一般的な慣行です。たとえば、GuavaのCloseablesクラスをご覧ください。ちなみに、Javaで事実上何でも閉じることができるようにするには、1つの方法だけが必要なはずです。
public static void closeQuietly(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (RuntimeException re) {
// Do something or ignore...
}
}
}
すべてのストリームと読者が閉鎖可能なインターフェイスを実装するため、この1つの方法はすべてのニーズに十分である必要があります。
一般的に、これは、スレッド-Bがストリームを閉じているというSpread-Aのストリームから読み込もうとしない限り、競合を引き起こしません。しかし、もしそうなら、あなたはこのリファクタリングの有無にかかわらずこの競合を持っているでしょう。このリファクタリングのみは導入されません 追加 競合。