Java synchronized(t)这个关键字修饰的代码块,意思是说获得t的锁之后,才能运行代码块。那么问题来了,如何知道某个对象t,是否被这样锁住了呢?
高洛峰2017-04-17 17:55:17
JDK의 Object 클래스는 객체의 객체 잠금이 잠겨 있는지 확인하는 API를 제공하지 않습니다. 그러나 다음과 같은 아이디어가 실현 가능할 수도 있습니다.
메모리에 있는 객체의 레이아웃은 다음과 같은 부분을 포함합니다
객체 헤더
객체 인스턴스 데이터(여기서는 관련 없음)
정렬된 패딩(여기서는 관련 없음)
객체 헤더에는 두 부분, 즉 마크 단어 필드와 클래스 필드를 포함하여 이 객체의 일부 메타데이터가 포함되어 있습니다.
마크 단어에는 잠금 플래그가 포함되어 있습니다. 객체가 잠겨 있지 않으면 플래그는 0이고 그렇지 않으면 1입니다.
마크 단어의 크기도 플랫폼마다 다릅니다.
으아아아 그러므로 마크워드만 얻을 수 있다면 잠금 플래그를 얻을 수 있고, 그러면 객체가 잠겨 있는지 알 수 있습니다. 그러나 JDK에서는 객체의 인스턴스 데이터(변수 및 메소드)만 조작할 수 있고, 객체의 객체 헤더를 가져올 수 있는 방법은 없습니다. 따라서 Javasun.misc.Unsafe
에서 "블랙 기술"을 사용해야 할 수도 있습니다.
32비트 jdk를 예로 들어보겠습니다.
으아아아여기서 0L은 오프셋입니다.
그런 다음 작성자는 마크워드에서 특정 콘텐츠를 검색해야 합니다.
원본 포스터의 질문으로 돌아가서, 아마도 원본 포스터는 단지 잠금이 유지되었는지 알 수 있는 방법을 원할 뿐이며 반드시 개체가 동기화되었는지 여부에 대한 문제를 다룰 필요는 없을 것입니다.
그렇다면 포스터는 동기화된 키워드를 버리고 대신 juc에서 ReentrantLock을 사용할 수 있습니다isLocked()