多线程 - Java synchronized(t)的问题,如何知道某个对象t,是否被这样锁住了呢?
PHPz
PHPz 2017-04-17 17:53:17
0
1
320

Java synchronized(t)这个关键字修饰的代码块,意思是说获得t的锁之后,才能运行代码块。那么问题来了,如何知道某个对象t,是否被这样锁住了呢?

PHPz
PHPz

学习是最好的投资!

全員に返信(1)
小葫芦

JDK の Object クラスは、オブジェクトのオブジェクト ロックがロックされているかどうかを判断する API を提供しません。しかし、次のようなアイデアも実現可能かもしれません。

メモリ内のオブジェクトのレイアウトには次の部分が含まれます

  • オブジェクトヘッダー

  • オブジェクト インスタンス データ (ここでは関係ありません)

  • 整列されたパディング (ここでは関係ありません)

オブジェクトのヘッダーには、マーク ワード フィールドとクラス フィールドの 2 つの部分を含む、このオブジェクトのいくつかの メタデータが含まれています。
マーク ワードには、ロック フラグが含まれています。オブジェクトがロックされていない場合、フラグは 0 で、それ以外の場合は 1 です。

マークワードのサイズもプラットフォームによって異なります:

リーリー

したがって、マークワードを取得できれば、ロックフラグを取得でき、オブジェクトがロックされているかどうかを知ることができます。ただし、JDK ではオブジェクトのインスタンス データ (変数やメソッド) しか操作できず、オブジェクトのオブジェクト ヘッダーを取得する方法はありません。したがって、Javasun.misc.Unsafe の「ブラック テクノロジ」を使用する必要がある場合があります。

32 ビット jdk を例に挙げます:

リーリー

ここでの 0L はオフセットです。
次に、作成者はマークワードに対してビット操作を実行し、マークワード内の特定のコンテンツを検索する必要があります。

元の投稿者の質問に戻りますが、おそらく元の投稿者は、ロックが保持されているかどうかを知る方法が必要なだけで、オブジェクト t が同期されているかどうかの問題に必ずしも取り組む必要はありません。
その場合、投稿者は同期されたキーワードを放棄し、代わりに Juc で ReentrantLock を使用して、ロックが保持されているかどうかを判断する方法があります。isLocked()

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