3

Baseから継承するクラスAとBがあります。

Baseにはプライベートメソッドがあります。AとBがこのメソッドを同時に実行する可能性があります。

そのため、そのメソッドを同期させたいと思います。署名に「synchronize」キーワードを入れるだけで、AとBの実行が同期されます(同じロックを共有します)?または、静的ロックオブジェクトを生成する必要がありますか...?

すみません、少し混乱しています...

4

4 に答える 4

3

コードが以下の例のように見える場合は、スレッドセーフではないため、プライベートメソッドの呼び出しincrementがアトミックであることを確認し、可視性を確保するために、何らかの形式の同期を含める必要があります。その単純な例では、getNewCounter同期させるだけで十分です。ロックオブジェクトの使用も機能します。

public class Base {
    private int counter;

    private void increment() {
        counter++;
    }
    protected int getNewCounter() {
        increment();
        return counter;
    }
}

public class A extends Base {
    public int aMethod() {
        return getNewCounter();
    }
}

public class B extends Base {
    public int anotherMethod() {
        return getNewCounter();
    }
}
于 2012-05-22T16:43:50.803 に答える
2

Baseにはプライベートメソッドがあります。AとBがこのメソッドを同時に実行する可能性があります。

プライベートメソッドまたはフィールドは派生クラスに継承されないため、質問への回答は「いいえ」です。

コメントに従って編集:

2つのオブジェクトAとBがあり、それらがシングルトンオブジェクトCを操作しようとしている場合、その場合、同期が必要なのはCであり、AとBではありません。

マルチスレッドアプリケーションで従う一般的なルールは、安定した状態を維持するために同時アクセスからの保護を必要とするすべてのクラスは、同期を正しく使用する責任があります。メソッドの呼び出し元がオブジェクトの状態にアクセスすることを期待するべきではありません。同期された方法。

于 2012-05-22T16:37:23.590 に答える
2

あなたの投稿から私が理解できるのは、プライベートメソッドを持つ基本クラスがあるということです。この基本クラスまたは基本クラスから派生したクラスのさまざまなオブジェクトを作成しています。

ここで、プライベートメソッドを同期化すると、複数のオブジェクトがあるため、そのメソッドの実行は同期化されません。インスタンスレベルのロックはオブジェクトごとにのみ行われます。

たとえば、クラスTestのObjectAとObjectBがある場合、これらのオブジェクトは両方とも、オブジェクトがロックされているために同期されている場合でも、クラスTestで定義されたmyMethod()などのプライベートメソッドを同時に実行できます。

お役に立てれば。

于 2012-05-22T16:49:55.590 に答える
0

私が知っているのは、プライベートメンバーは継承されないということです。したがって、クラスAとクラスBは、このプライベートメソッドにアクセスできるパブリックメソッドがBaseクラスに存在するまで、継承を使用するか、Baseクラスのオブジェクトを作成してこのメ​​ソッドを呼び出すことでこのプライベートメソッドにアクセスできません。

于 2012-05-22T17:13:11.707 に答える