Java:もしあれば、それらが属するオブジェクトとは別に同期メソッドによってロックされるものは何ですか?

StackOverflow https://stackoverflow.com/questions/609963

質問

今、これがばかげた質問かどうかわかりません。もしそうなら、我慢してください。

オブジェクトのロックは「再帰的」です。 e。 2つのオブジェクトのフィールドに3番目のオブジェクトへの参照があり、スレッドが2つのうちの1つで同期メソッドを実行している場合、他のスレッドは3番目のオブジェクトにアクセスできますか?

// a and b are some objects that implement Runnable
// they both reference the same third object
a.ref = c;
b.ref = c;

// a is run in a thread and processes some data in a loop for a long time
// the method the loop belongs to is declared synchronized
threadA = new Thread(a);
threadA.start();

a.someSyncedMethod(); // this would block ...
b.ref.someOtherSyncedMethod(); // ... but would this?
a.ref.someOtherSyncedMethod(); // ... and how about this?
役に立ちましたか?

解決

「ロック」の概念を区別する価値はあります。および「オブジェクトのロック」。 「オブジェクトをロックする」という本当の考えはありません。 -「取得(および解放)」があります。オブジェクトに関連付けられているロック 。はい、私はちょっとピッキングしているように聞こえますが、オブジェクトがロックされていることについて話すと、そのロックが他のスレッドはオブジェクト内の何も変更できないように聞こえるため、区別が重要です

代わりに、ロックが保持されている間は他のスレッドが同じロックを取得できないことを意味します。ロックと、ロックが関連付けられているオブジェクトのコンテンツとの間には直接的な関係はありません。

" synchronized"と宣言されたメソッド所属するオブジェクトのインスタンスに関連付けられたロックを取得します。これにより、同じオブジェクトの他の同期メソッドと、明示的に同期する同期ステートメントのみが待機されます。

個人的には同期メソッドは好きではありません-同期にのみ使用される(プライベート、最終)メンバー変数で明示的に同期することで、より明確にするのが好きです。

他のヒント

a.someSyncedMethod(); // this would block ...

runメソッドをsynchronizedでマークするか、ThreadAを同期メソッドでコードを実行させる場合のみ。

JVMでは、各オブジェクトはモニターと呼ばれるものを所有しています。特定のオブジェクトに関連付けられたモニターを一度に所有できるスレッドは1つだけです。 Synchronizedは、続行する前に現在のスレッドにモニターを取得するよう指示する手段です。

また、クラス自体が静的メソッドのモニターを所有しています。

「ロック」の意味(実際、このバリアントはモニターと呼ばれます)完全に慣習であり、アクセス制限は適用されません。

機能は、すべてのオブジェクトが適切に動作し、データにアクセスする前に対応するロックを取得することに依存しています。適切なアクセス制御を備えたクラス内でこの望ましい動作をカプセル化することによってのみ、クライアントオブジェクトに対してそれを実施できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top