Kunci putaran: bermakna apabila benang memperoleh kunci, jika kunci telah diperoleh oleh benang lain, maka benang akan menunggu dalam gelung , dan kemudian secara berterusan menentukan sama ada kunci boleh berjaya diperoleh, dan gelung tidak akan keluar sehingga kunci diperoleh.
Penguncian optimistik: Dengan mengandaikan tiada konflik, jika data didapati tidak konsisten dengan data yang diperoleh sebelum ini semasa mengubah suai data, baca data terkini dan cuba semula pengubahsuaian.
Kunci pesimis: Andaikan bahawa konflik serentak akan berlaku, segerakkan semua operasi berkaitan data dan mula mengunci daripada membaca data.
Kunci eksklusif (tulis): Tambahkan kunci tulis pada sumber Benang boleh mengubah suai sumber, tetapi utas lain tidak boleh menguncinya semula (tulisan tunggal).
Kunci kongsi (baca): Selepas menambah kunci baca pada sumber, ia hanya boleh dibaca tetapi tidak diubah suai hanya boleh menambah kunci baca dan tidak boleh menambah kunci tulis (berbilang ). Anggap sahaja ia sebagai Semaphore (semaphore).
Kunci masuk semula & kunci bukan masuk semula: Selepas utas memperoleh kunci, ia boleh memasuki kod lain yang disegerakkan dengan kunci yang sama dengan bebas.
Kunci adil & kunci tidak adil: Perintah bersaing untuk kunci, jika tiba dahulu, dahulu dilayan, adalah adil. Maksudnya, ia adalah kunci yang adil jika perintah merebut kunci dan perintah merebut kunci dijamin sama.
Ciri: masuk semula, eksklusif, kunci pesimis.
Pengoptimuman berkaitan kunci:
Penghapusan kunci: Parameter untuk mendayakan penyingkiran kunci termasuk -XX:+DoEscapeAnalysis
dan -XX:+EliminateLocks
.
Pengasar kunci: JDK telah mengoptimumkan pengasar kunci, tetapi kami sendiri boleh mengoptimumkannya dari tahap kod.
/** * 锁消除示例,JIT即时编译,进行了锁消除 * @author 刘亚楼 * @date 2020/1/16 */ public class LockEliminationExample { /** * StringBuilder线程不安全,StringBuffer用了synchronized关键字,是线程安全的 * 针对下面这种单线程加锁、解锁操作,JIT会进行优化,进行锁消除 */ public static void eliminateLock() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("a"); stringBuffer.append("b"); stringBuffer.append("c"); stringBuffer.append("a"); stringBuffer.append("b"); stringBuffer.append("c"); stringBuffer.append("a"); stringBuffer.append("b"); stringBuffer.append("c"); } }
/** * 锁粗化示例 * @author 刘亚楼 * @date 2020/1/16 */ public class LockCoarseningExample { /** * 针对下面这种无意义的加锁操作,JIT会进行优化,对变量i的所有操作放到一个同步代码块里 */ public static void lockCoarsening() { int i = 0; synchronized (LockCoarseningExample.class) { i++; } synchronized (LockCoarseningExample.class) { i--; } synchronized (LockCoarseningExample.class) { i++; } synchronized (LockCoarseningExample.class) { i++; i--; i++; } } }
Nota: Perbezaan antara penyingkiran kunci dan penyingkiran kunci ialah penyingkiran kunci. dioptimumkan untuk menambah dan membuka kunci benang tunggal, dan akhirnya tiada kunci wujud. Kunci kasar bukan sahaja untuk benang tunggal, tetapi akhirnya masih terdapat kunci.
Pertama sekali, objek dalam timbunan terdiri daripada pengepala objek, data contoh dan padding penjajaran.
Tajuk objek mengandungi dua bahagian maklumat Bahagian pertama digunakan untuk menyimpan data masa jalan objek itu sendiri, seperti kod cincang, umur penjanaan GC, bendera status kunci, kunci dipegang oleh utas, berat sebelah. id kunci, dsb. Bahagian data ini secara rasmi dipanggil "Mark Word".
Bahagian pengepala objek yang lain ialah penuding jenis, yang merupakan penuding objek kepada metadata kelasnya Mesin maya menggunakan penuding ini untuk menentukan kelas mana objek itu adalah contoh.
Kunci yang dilaksanakan secara disegerakkan dicapai dengan menukar "Mark Word" pengepala objek.
"Mard Word" masing-masing ialah 32-bit dan 64-bit dalam mesin maya 32-bit dan 64-bit (penunjuk termampat tidak dihidupkan). Mesin maya 32-bit "Mark Word" adalah seperti berikut:
untuk mengubah suai nilai yang dijangkakan ialah kunci-. kandungan perkataan tanda keadaan bebas , nilai baharu ialah kandungan perkataan tanda status kunci ringan Jika pengubahsuaian berjaya, cas
menunjuk ke Lock record address
urutan yang berjaya memperoleh kunci. Lock Record
Jika kunci pincang dihidupkan, hanya satu utas boleh mengambil kunci dan mendapatkan pincang kunci.
Mengenai Bias Lock Mark Word, kandungannya adalah seperti berikut: -XX:-UseBiasedLocking
Bendera berat sebelah berguna buat kali pertama, tetapi menjadi tidak berguna selepas perbalahan berlaku.
Intipati kunci berat sebelah ialah ia bebas kunci Jika tiada persaingan berbilang benang untuk kunci, JVM menganggapnya sebagai satu utas dan tiada penyegerakan diperlukan.
Nota: Untuk mengurangkan kerja JVM, penyegerakan dilaksanakan oleh banyak operasi di bahagian bawah JVM Jika tiada pertikaian, tidak perlu melakukan operasi penyegerakan.
Jika kunci berat sebelah tidak dihidupkan, keadaan bebas kunci akan dinaik taraf kepada kunci ringan dahulu, dan kunci ringan akan dinaik taraf kepada kelas berat jika ia dipilih pada tahap tertentu.
Jika penguncian berat sebelah didayakan, terdapat dua situasi:
Apabila kunci tidak diduduki, ia akan dinaik taraf kepada bebas kunci dan kehendak bebas kunci dinaik taraf kepada ringan Kunci dinaik taraf daripada kunci ringan kepada kunci berat.
Apabila kunci telah diisi, ia akan ditingkatkan kepada kunci ringan, dan kemudian dinaik taraf daripada kunci ringan kepada kunci berat.
Atas ialah kandungan terperinci Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!