Rumah > Soal Jawab > teks badan
Java synchronized(t)这个关键字修饰的代码块,意思是说获得t的锁之后,才能运行代码块。那么问题来了,如何知道某个对象t,是否被这样锁住了呢?
高洛峰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()