2

Java には、シングル スレッド アプリケーションで使用しているオブジェクト/グループ (サービス オブジェクト、コントローラーなど) があるとします。このオブジェクトを「A」と呼びましょう。

しばらくしてスレッド モデルを拡張し、これらのオブジェクトを他のスレッド (リスナー スレッドなど) でも使用したいと考えています。

もちろん、そのような場合、同期の問題などに注意する必要があります。しかし、これまでオブジェクト「A」を使用していた開発者は、アーキテクチャの変更に気付くことができず、class/(オブジェクト)「A」に何かを追加すると、同期を適切に処理できない可能性があります。もちろん、この開発者はコード内のクラス「A」のすべての出現をチェックする必要がありますが、このクラスがマルチスレッド環境で使用されることに慣れていない場合は、チェックしない可能性があります。

私の質問は...そのクラス/(オブジェクト)「A」を「マルチスレッド使用可能」としてマークする、その状況に適したパターンはありますか。たとえば、「情報」のみを目的としたインターフェイスの実装などです。

4

2 に答える 2

2

私は通常、JavaDoc のコードの先頭にコメントを入れて、何かがマルチスレッドでの使用を意図していることを示します。

用途が明確になるように、単体テストも追加することがよくあります。

その後、他の開発者がドキュメントと単体テストを読んで、意図した使用法を認識できるようにします。

于 2013-03-05T12:46:06.627 に答える
1

このオブジェクトがすべてのクライアントと疎結合されている場合、"A" のスレッドセーフ バージョンを作成できるはずです。

JDK から直接の例:

java.lang.Appendable - the interface
java.lang.StringBuilder - regular implementation
java.lang.StringBuffer - thread-safe implementation

インターフェイスを介して間接的にオブジェクトを使用しているため、クライアントはそれがスレッドセーフ バージョンであるかどうかを知る必要はありません。

void doSomething(Appendable a) {
   a.append(...);
}

実用的な観点からは、制御の反転を使用すると非常に役立ちます。ビジネス コントラクト宣言にはインターフェイスを使用し、コンポーネント インジェクションには Spring (またはその他の依存性注入フレームワーク) を使用します (スレッドセーフかどうかは構成のみに依存します)。

要するに、このような問題は、疎結合とスマートなアーキテクチャ設計 (関心の分離など) で防ぐことができます。

于 2013-03-05T13:13:37.257 に答える