java - 一个类的对象锁只有一个,类锁呢?
高洛峰
高洛峰 2017-04-18 10:49:00
0
6
739

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(6)
巴扎黑

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

いいねを押す +0
洪涛

リーリー

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

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

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

  • さらに、A と B の間で異なるロックが使用されるため、競合は発生しません
いいねを押す +0
左手右手慢动作

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

いいねを押す +0
伊谢尔伦

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

【非静的メソッド】

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

【静的メソッド】

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

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

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

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

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

いいねを押す +0
伊谢尔伦

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート