0

外部で使用するためのスレッドセーフな API を提供することを担当する ClassA が 1 つあるとします。また、一部の ClassA API は、別の ClassB から何らかのメソッドを呼び出して、いくつかのロジックを実行する必要があります (ClassB のメソッドがステートレスでスレッドセーフであるとします)。ただし、ビジネス ロジックのため、ClassB と ClassA を 1 つのクラスとしてマージすることはできません。たとえば、次のコード スニペットのように。これを達成するためのより良い方法はありますか? もちろん、同期ブロック、同時ロックフリー データ構造などの ClassA に対して、より細かい粒度の同時実行制御を使用することもできます。

ありがとう!

public class ClassA{
   public synchronized void method1(ClassB cb){
     //do internal stuff1
     cb.printAlog();
     //do internal stuff2
   }
   public synchronized void method2(){
     //do internal stuff3
   }
   ......
}

public class ClassB{
   public void printALog(){
     //....
   }
   ......
}
4

2 に答える 2

2

質問は意味がありません。クラスBがステートレスの場合、呼び出しを同期する必要はまったくありません。クラスAで同期が必要なものはすべて同期する必要があります。これについては、正確にゼロの情報を提供しました。クラスBは、この質問とは100%無関係です。

于 2012-09-17T10:08:46.477 に答える
0

私が質問を理解している限り、スレッドセーフでないコードをスレッドセーフなクラスで保護することについて迷っています。この観点から、あなたが提供したコードは、何らかの方法で classB を公開しない限り、完全に合法であり、classA の契約を破ることが可能になります。

この設計は、実際の Java 並行性でも非常によく説明されています。

于 2012-09-17T13:19:07.857 に答える