Java synchronized(t)这个关键字修饰的代码块,意思是说获得t的锁之后,才能运行代码块。那么问题来了,如何知道某个对象t,是否被这样锁住了呢?
学习是最好的投资!
JDK の Object クラスは、オブジェクトのオブジェクト ロックがロックされているかどうかを判断する API を提供しません。しかし、次のようなアイデアも実現可能かもしれません。
メモリ内のオブジェクトのレイアウトには次の部分が含まれます
オブジェクトヘッダー
オブジェクト インスタンス データ (ここでは関係ありません)
整列されたパディング (ここでは関係ありません)
オブジェクトのヘッダーには、マーク ワード フィールドとクラス フィールドの 2 つの部分を含む、このオブジェクトのいくつかの メタデータが含まれています。マーク ワードには、ロック フラグが含まれています。オブジェクトがロックされていない場合、フラグは 0 で、それ以外の場合は 1 です。
マークワードのサイズもプラットフォームによって異なります:
したがって、マークワードを取得できれば、ロックフラグを取得でき、オブジェクトがロックされているかどうかを知ることができます。ただし、JDK ではオブジェクトのインスタンス データ (変数やメソッド) しか操作できず、オブジェクトのオブジェクト ヘッダーを取得する方法はありません。したがって、Javasun.misc.Unsafe の「ブラック テクノロジ」を使用する必要がある場合があります。
sun.misc.Unsafe
32 ビット jdk を例に挙げます:
ここでの 0L はオフセットです。 次に、作成者はマークワードに対してビット操作を実行し、マークワード内の特定のコンテンツを検索する必要があります。
元の投稿者の質問に戻りますが、おそらく元の投稿者は、ロックが保持されているかどうかを知る方法が必要なだけで、オブジェクト t が同期されているかどうかの問題に必ずしも取り組む必要はありません。 その場合、投稿者は同期されたキーワードを放棄し、代わりに Juc で ReentrantLock を使用して、ロックが保持されているかどうかを判断する方法があります。isLocked()
isLocked()
JDK の Object クラスは、オブジェクトのオブジェクト ロックがロックされているかどうかを判断する API を提供しません。しかし、次のようなアイデアも実現可能かもしれません。
メモリ内のオブジェクトのレイアウトには次の部分が含まれます
オブジェクトヘッダー
オブジェクト インスタンス データ (ここでは関係ありません)
整列されたパディング (ここでは関係ありません)
オブジェクトのヘッダーには、マーク ワード フィールドとクラス フィールドの 2 つの部分を含む、このオブジェクトのいくつかの メタデータが含まれています。
マーク ワードには、ロック フラグが含まれています。オブジェクトがロックされていない場合、フラグは 0 で、それ以外の場合は 1 です。
マークワードのサイズもプラットフォームによって異なります:
リーリーしたがって、マークワードを取得できれば、ロックフラグを取得でき、オブジェクトがロックされているかどうかを知ることができます。ただし、JDK ではオブジェクトのインスタンス データ (変数やメソッド) しか操作できず、オブジェクトのオブジェクト ヘッダーを取得する方法はありません。したがって、Java
sun.misc.Unsafe
の「ブラック テクノロジ」を使用する必要がある場合があります。32 ビット jdk を例に挙げます:
リーリーここでの 0L はオフセットです。
次に、作成者はマークワードに対してビット操作を実行し、マークワード内の特定のコンテンツを検索する必要があります。
元の投稿者の質問に戻りますが、おそらく元の投稿者は、ロックが保持されているかどうかを知る方法が必要なだけで、オブジェクト t が同期されているかどうかの問題に必ずしも取り組む必要はありません。
その場合、投稿者は同期されたキーワードを放棄し、代わりに Juc で ReentrantLock を使用して、ロックが保持されているかどうかを判断する方法があります。
isLocked()