0

以下のシナリオで、同期ブロックと同期メソッドの間に疑問があります。

パート1 - - - - - - - :

Class table
{
    Synchronized(this)
    {
        ……………………
    }
}

ここで、テーブルクラスのオブジェクトをロックしました。--------------------------------------…</p>

パート2:

Class table
{
    Customer cust=new Customer();
    Synchronized(cust)
    {
        ……………………
    }
}

ここでは、customer.ieのオブジェクトをロックしました。パート1では、?-テーブルクラスのオブジェクトをロックしました。
テーブルクラスのオブジェクトが異なる場所から同期ブロックに同時にアクセスしようとする可能性があるため、テーブルクラスがロックされます。これを防ぐために
、part1でテーブルクラスのオブジェクトがロックされました。ここでpart2に来てください:?-ここで、顧客クラスのオブジェクトをロックしました---------------------------------- ----…</p>

私の疑問:

  1. part2のテーブルクラス以外のテーブルクラスのオブジェクトをロックする必要があるのはなぜですか?

  2. パート2でcustをロックしない場合は、テーブルクラスを使用して同期ブロックにアクセスできます。custをロックする場合は、同期ブロックにアクセスするためにテーブルクラスのオブジェクトも必要です。テーブルクラスのオブジェクトは、同期ブロックにアクセスするためにのみ必要です。
    同期のため、テーブルクラスのオブジェクトが異なるスレッドから同期ブロックに同時にアクセスするのを防ぎました。では、なぜテーブルクラス以外のオブジェクトをテーブルクラスにロックする必要があるのでしょうか。

  3. 顧客クラスのオブジェクトは、
    異なる場所から同時に同期ブロックにアクセスしようとしますか?

  4. パート2では、テーブルクラス以外のオブジェクトをロックしました。テーブル以外のクラスのオブジェクトでテーブルクラスをロックすることは、パート2
    で顧客クラスのオブジェクトをロックすることの利点となるのはどのような状況ですか?

  5. 顧客クラス、つまりテーブルクラス以外のオブジェクトをロックする必要はありますか?

  6. パート2で顧客クラスのオブジェクトをロックしないと、どのような損害が発生しますか?

どうか、私はJavaスレッドを初めて使用し、しばらくの間、これらの質問に頭を悩ませようとしてきました。明確な説明があれば大いに役立ちます。ありがとう

4

2 に答える 2

1

最初に確認する必要があるのは、次のとおりです。さまざまなタイプの「synchronized」キーワードを使用して保護されるDATAフィールドの種類。

静的変数/メソッドはクラスレベルのオブジェクトであり、他のすべての変数/メソッドはインスタンスレベルです。

クラスレベルのロックは、対応するロックが解放されなくなるまで、クラスのすべてのオブジェクトを待機させるロックです。

例えば

Class A{
static synchronized void foo(){}
}

ここでは、メソッドfooが同期されているため、クラスのすべてのオブジェクトのすべてのスレッドは、現在fooメソッドを実行しているオブジェクトが実行を完了するまで待機します。

同様に、インスタンスレベルのロックにより、すべてのスレッドがクラスのインスタンスの使用を開始し、ロックが解放されなくなるまで待機します。

例えば

Class A{
synchronized void bar(){}
}

ここで、現在barメソッドを実行しているオブジェクトから開始されたすべてのスレッドは、現在のスレッドが実行を完了するまで待機します。他のオブジェクトの他のスレッドがbarメソッドを実行している間に、他のオブジェクトの他のスレッドがbarメソッドを実行できることに注意してください。

つまり、スレッドは、適切なオブジェクトロックを保持するまで、同期されたコードブロックに入ることができません。

の場合instance methods、これはインスタンスのロックです。

これはstatic methods、クラスオブジェクトロックです。

于 2012-12-13T08:28:32.543 に答える
0

既存のコードを分析して、同期がある理由を理解しようとしているようです。

part1とpart2のコードは同じ機能ですか?

2番目の部分では、同期は意味がありません。カスタマーオブジェクトを作成してから同期しても効果はありません。2番目のスレッドは、新しい顧客オブジェクトを作成し、そのオブジェクトをロックします。

既存のコードを変更する必要がある場合は、テストケースを記述し、スパンがスレッド化して同期を削除し、マルチスレッドの問題を強制できるかどうかを確認できます。

于 2012-12-13T08:52:25.670 に答える