0
abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public void aMethod(){
        //Some actions here
    }
}

public class B extends Basic{
    public void bMethod(){
        //Some actions here
    }
}

Basic a = new A();
Basic b = new B();

a.basicMethod(); // acquires lock
b.basicMethod(); //Same lock?

言い換えれば、ロックは具体的なオブジェクトまたはスーパークラスにも関連していますか?

4

5 に答える 5

5

別のロック。インスタンスメソッドは、その特定のオブジェクトインスタンスsynchronizedに関連付けられたモニターで同期するため、それぞれに独自のモニターがあります。ab

あなたが持っていた場合

abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public synchronized void aMethod(){
        //Some actions here
    }
}

次に、を呼び出してa.basicMethod()同じa.aMethod()モニターをロックします。

于 2012-12-10T17:18:53.123 に答える
2

どちらもa & bロックを取得しますが、これらのロックはオブジェクト参照に関連付けられています。したがってa & b、両方が異なるロックを取得することにより、同じポイントで同期領域に入ることができます。

言い換えれば、ロックは具体的なオブジェクトまたはスーパークラスにも関連していますか?

ロックはオブジェクトインスタンスに関連しています。

于 2012-12-10T17:18:38.443 に答える
1

私の知る限り、ロックはクラス定義ではなく、オブジェクト参照に対して保持されています。これは、同じオブジェクト参照に保持されていないため、これらが2つの異なるロックになることを意味します。JavaのすべてのオブジェクトはObjectクラスのサブクラスであるため、最上位のスーパークラスをロックする場合は、プログラムに1つのロックしか設定できないことに注意してください。

于 2012-12-10T17:19:42.947 に答える
1

ロックはで保持されるため、さまざまなロックがありますobjectJavadocによると

まず、同じオブジェクトで同期されたメソッドを2回呼び出すことはできません。1つのスレッドがオブジェクトの同期メソッドを実行している場合、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッドは、最初のスレッドがオブジェクトで完了するまで実行を一時停止します。

于 2012-12-10T17:22:40.330 に答える
1
Basic a = new A();
Basic b = new B();

それぞれabは異なるオブジェクト参照を持っているため、異なるロックを持っているため、2つの異なるロックを使用してsynchornizedメソッドを呼び出すことができます。

于 2012-12-10T17:23:44.790 に答える