cari

Rumah  >  Soal Jawab  >  teks badan

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

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

PHPzPHPz2889 hari yang lalu324

membalas semua(1)saya akan balas

  • 高洛峰

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

    Kelas Objek dalam JDK tidak menyediakan API untuk menentukan sama ada kunci objek objek dikunci. Tetapi idea-idea berikut mungkin boleh dilaksanakan.

    Susun atur objek dalam ingatan termasuk bahagian berikut

    • Pengepala objek

    • Data contoh objek (tidak berkenaan di sini)

    • Padding sejajar (tidak berkenaan di sini)

    Tajuk objek mengandungi beberapa metadata objek ini, termasuk dua bahagian: medan kata tanda dan medan kelas
    Kata tanda mengandungi bendera kunci Apabila objek tidak dikunci, bendera adalah 0, jika tidak ia adalah 1.

    Saiz kata tanda juga berbeza pada platform yang berbeza:

    For 32 bit JVM:
        _mark    : 4 byte constant
        _klass    : 4 byte pointer to class 
    
    For 64 bit JVM:
        _mark    : 8 byte constant
        _klass    : 8 byte pointer to class
    
    For 64 bit JVM with compressed-oops:
        _mark    : 8 byte constant
        _klass    : 4 byte pointer to class

    Oleh itu, selagi anda boleh mendapatkan kata kunci, anda boleh mendapatkan bendera kunci, dan kemudian anda boleh mengetahui sama ada objek dikunci. Walau bagaimanapun, dalam JDK, kita hanya boleh mengendalikan data contoh (pembolehubah dan kaedah) objek, dan tidak ada cara untuk mendapatkan pengepala objek objek. Oleh itu, anda mungkin perlu menggunakan "teknologi hitam" dalam Java sun.misc.Unsafe.

    Ambil jdk 32-bit sebagai contoh:

    Object obj = new Object();
    int markword = unsafe.getInt(obj, 0L);

    0L di sini ialah offset.
    Kemudian lakukan sedikit operasi pada kata kunci Pengarang perlu mencari kandungan tertentu dalam kata kunci.

    Berbalik kepada soalan poster asal, mungkin poster asal hanya mahukan cara untuk mengetahui sama ada kunci itu dipegang, dan tidak semestinya perlu berdepan dengan isu sama ada objek t disegerakkan.
    Jika ya, poster boleh meninggalkan kata kunci yang disegerakkan dan sebaliknya menggunakan ReentrantLock dalam juc ​​. Terdapat kaedah untuk menentukan sama ada kunci itu dipegang isLocked()

    balas
    0
  • Batalbalas