찾다

 >  Q&A  >  본문

多线程 - Java synchronized(t)的问题,如何知道某个对象t,是否被这样锁住了呢?

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

PHPzPHPz2889일 전327

모든 응답(1)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-17 17:55:17

    JDK의 Object 클래스는 객체의 객체 잠금이 잠겨 있는지 확인하는 API를 제공하지 않습니다. 그러나 다음과 같은 아이디어가 실현 가능할 수도 있습니다.

    메모리에 있는 객체의 레이아웃은 다음과 같은 부분을 포함합니다

    • 객체 헤더

    • 객체 인스턴스 데이터(여기서는 관련 없음)

    • 정렬된 패딩(여기서는 관련 없음)

    객체 헤더에는 두 부분, 즉 마크 단어 필드와 클래스 필드를 포함하여 이 객체의 일부 메타데이터가 포함되어 있습니다.
    마크 단어에는 잠금 플래그가 포함되어 있습니다. 객체가 잠겨 있지 않으면 플래그는 0이고 그렇지 않으면 1입니다.

    마크 단어의 크기도 플랫폼마다 다릅니다.

    으아아아

    그러므로 마크워드만 얻을 수 있다면 잠금 플래그를 얻을 수 있고, 그러면 객체가 잠겨 있는지 알 수 있습니다. 그러나 JDK에서는 객체의 인스턴스 데이터(변수 및 메소드)만 조작할 수 있고, 객체의 객체 헤더를 가져올 수 있는 방법은 없습니다. 따라서 Javasun.misc.Unsafe에서 "블랙 기술"을 사용해야 할 수도 있습니다.

    32비트 jdk를 예로 들어보겠습니다.

    으아아아

    여기서 0L은 오프셋입니다.
    그런 다음 작성자는 마크워드에서 특정 콘텐츠를 검색해야 합니다.

    원본 포스터의 질문으로 돌아가서, 아마도 원본 포스터는 단지 잠금이 유지되었는지 알 수 있는 방법을 원할 뿐이며 반드시 개체가 동기화되었는지 여부에 대한 문제를 다룰 필요는 없을 것입니다.
    그렇다면 포스터는 동기화된 키워드를 버리고 대신 juc에서 ReentrantLock을 사용할 수 있습니다isLocked()

    회신하다
    0
  • 취소회신하다