一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数
假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?
巴扎黑2017-04-18 10:51:00
前のメソッドはインスタンス オブジェクトをロックし、現在のオブジェクトをロックします。複数のインスタンス オブジェクトがある場合、これらの synchronized
メソッドは同期されません。 2 番目のタイプのロックはクラス オブジェクトです。クラス オブジェクトは 1 つだけなので、同期されます。
PHP中文网2017-04-18 10:51:00
リーリー
上記のコードでは、test1メソッドとtest2が同じオブジェクトの場合、ブロッキングが発生します。もちろん、これは違うので、別のオブジェクトであっても問題ありません。これはオブジェクトレベルのロックと呼ばれます。
test3 は test4 と同等です。ここでは、クラス オブジェクトがロックとして使用されます。これは、通常、クラスのクラス インスタンスは 1 つだけであるため、このメソッドに入るたびにロックされます。これはクラスレベルのロックと呼ばれます。
大家讲道理2017-04-18 10:51:00
非静的同期メソッド (A) で使用されるロックは、現在のインスタンス オブジェクトそのものです。1 つのインスタンスの A がロックを取得した後、インスタンスの他の A はロックが解放されるまで待機する必要があります。複数のインスタンスは異なるロックを使用します。 ;
静的同期メソッド (B) で使用されるロックは、1 つの B がロックを取得すると、それが 1 つのインスタンスであっても複数のインスタンスであっても、他の B はロックを解放するまで待機する必要があります。
ringa_lee2017-04-18 10:51:00
Class
クラスがオブジェクトを作成するとき、それは共通のクラスを表します。このとき、「クラスロック」はこのインスタンスオブジェクトのロックです
伊谢尔伦2017-04-18 10:51:00
「ミューテックス ロック」の概念について話しています。同期変更方法には 2 つの状況があります。
【非静的メソッド】
同期によってメソッドが変更される場合、ロック オブジェクトは現在のメソッドが属するオブジェクト、つまりメソッド内のこれです。【静的メソッド】
synchronized によって静的メソッドが変更された場合、静的メソッドによってロックされているオブジェクトは、現在のクラス オブジェクト (Class クラスのインスタンス) になります。各クラスには固有のクラス オブジェクトがあります。クラス オブジェクトの取得方法: classname.class。相互に排他的なシナリオでは、次の 2 つの点を理解する必要があります:
1. 静的メソッドと非静的メソッドは同時に同期宣言され、相互に排他的ではありません。その理由は、静的メソッドは、現在のメソッドが属するオブジェクトではなく、クラス オブジェクトをロックするためです。つまり、「一度に 1 つのスレッドだけがいずれかの関数を呼び出すことができる」(つまり、相互排他) という場合、メソッドの種類に関係なく、ロック オブジェクトが同じであるかどうかが判断条件となります。2. Synchronized が 2 つの異なるコードを変更するが、ロック オブジェクトが同じ場合、2 つのスレッドはそれぞれ 2 つのコードを呼び出すときに相互排他的になります
伊谢尔伦2017-04-18 10:51:00
オブジェクト メソッドの同期変更の場合、ロックはオブジェクト自体です。
静的メソッドの同期変更の場合、ロックはクラス オブジェクト自体です。これはクラス ローダーによって作成されたクラス オブジェクトです。