検索

ホームページ  >  に質問  >  本文

java - 一个类的对象锁只有一个,类锁呢?

一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数

假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?

高洛峰高洛峰2802日前744

全員に返信(6)返信します

  • 巴扎黑

    巴扎黑2017-04-18 10:51:00

    前のメソッドはインスタンス オブジェクトをロックし、現在のオブジェクトをロックします。複数のインスタンス オブジェクトがある場合、これらの synchronized メソッドは同期されません。 2 番目のタイプのロックはクラス オブジェクトです。クラス オブジェクトは 1 つだけなので、同期されます。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:51:00

    リーリー

    上記のコードでは、test1メソッドとtest2が同じオブジェクトの場合、ブロッキングが発生します。もちろん、これは違うので、別のオブジェクトであっても問題ありません。これはオブジェクトレベルのロックと呼ばれます。
    test3 は test4 と同等です。ここでは、クラス オブジェクトがロックとして使用されます。これは、通常、クラスのクラス インスタンスは 1 つだけであるため、このメソッドに入るたびにロックされます。これはクラスレベルのロックと呼ばれます。

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:51:00

    • 非静的同期メソッド (A) で使用されるロックは、現在のインスタンス オブジェクトそのものです。1 つのインスタンスの A がロックを取得した後、インスタンスの他の A はロックが解放されるまで待機する必要があります。複数のインスタンスは異なるロックを使用します。 ;

    • 静的同期メソッド (B) で使用されるロックは、1 つの B がロックを取得すると、それが 1 つのインスタンスであっても複数のインスタンスであっても、他の B はロックを解放するまで待機する必要があります。

    • さらに、A と B の間で異なるロックが使用されるため、競合は発生しません

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 10:51:00

    Classクラスがオブジェクトを作成するとき、それは共通のクラスを表します。このとき、「クラスロック」はこのインスタンスオブジェクトのロックです

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:00

    「ミューテックス ロック」の概念について話しています。同期変更方法には 2 つの状況があります。

    【非静的メソッド】

    同期によってメソッドが変更される場合、ロック オブジェクトは現在のメソッドが属するオブジェクト、つまりメソッド内のこれです。

    【静的メソッド】

    synchronized によって静的メソッドが変更された場合、静的メソッドによってロックされているオブジェクトは、現在のクラス オブジェクト (Class クラスのインスタンス) になります。各クラスには固有のクラス オブジェクトがあります。クラス オブジェクトの取得方法: classname.class。

    相互に排他的なシナリオでは、次の 2 つの点を理解する必要があります:

    1. 静的メソッドと非静的メソッドは同時に同期宣言され、相互に排他的ではありません。その理由は、静的メソッドは、現在のメソッドが属するオブジェクトではなく、クラス オブジェクトをロックするためです。

    2. Synchronized が 2 つの異なるコードを変更するが、ロック オブジェクトが同じ場合、2 つのスレッドはそれぞれ 2 つのコードを呼び出すときに相互排他的になります

    つまり、「一度に 1 つのスレッドだけがいずれかの関数を呼び出すことができる」(つまり、相互排他) という場合、メソッドの種類に関係なく、ロック オブジェクトが同じであるかどうかが判断条件となります。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:00

    オブジェクト メソッドの同期変更の場合、ロックはオブジェクト自体です。
    静的メソッドの同期変更の場合、ロックはクラス オブジェクト自体です。これはクラス ローダーによって作成されたクラス オブジェクトです。

    返事
    0
  • キャンセル返事