1

私はスレッドセーフなプログラミングにかなり慣れていないので、以下のようなものがあるかどうか疑問に思っていました。コンパイルして実行すると、デッドロックから安全になりますか?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
4

4 に答える 4

6

コードは単一のスレッドのみを表示します。

スレッドが1つしかないため、デッドロックが発生することはありません。

追加: Java言語は、正式にリエントラント同期
と呼ばれるものをサポートします。これは基本的に、単一のスレッドがすでに所有しているロックを再取得できることを意味します。

于 2009-11-02T09:00:14.953 に答える
5

あなたの質問は、同じオブジェクトで2回同期するとどうなるかということです。

答えは次のとおりです。Javaは最初に、どのスレッドがモニターを所有しているかをチェックします(これsynchronizedが動作する内部データ構造です)。所有者スレッドは現在のスレッドと同じであるため、Javaは続行されます。

デッドロックは、2つのモニターがあり、それらを異なるスレッドで異なる順序でロックしようとした場合にのみ発生する可能性があります。

于 2009-11-02T09:04:01.513 に答える
4

Javaのsynchronizedキーワードによって取得されるロックはネストをサポートしているため、同じスレッドで同じオブジェクトを複数回同期することでデッドロックのリスクを回避できます。

于 2009-11-02T09:02:53.720 に答える
1

RichNは、コードに含まれるスレッドが1つだけであるため、デッドロックが発生しないという点で正しいです。また、デッドロックが発生するためには、デッドロックが発生するために複数のスレッドが複数のロックを取得する必要があることに注意してください(順序は異なりますが)。

現在、コードは1つのロックのみを参照しています:に関連付けられているロック_mySynchedDataJavaでのロックは再入可能であるため、2回ロックしようとしても問題ありません。

于 2009-11-02T09:03:52.247 に答える