Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci
1. Konsep kunci dalam Java
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.
2. Ciri disegerakkan kata kunci yang disegerakkan
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.
1. Contoh penyingkiran kunci
/** * 锁消除示例,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"); } }
2. Contoh penyingkiran kunci
/** * 锁粗化示例 * @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.
3. Prinsip kata kunci disegerakkan
1. Perihal Mark Word
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:
2. Status kunci berubah
(1) Tiada kunci→ >
Apabila bebas kunci menjadi kunci ringan, berbilang utas akan membaca kandungan perkataan tanda keadaan bebas kunci bagi pengepala objek, dan kemudian melakukan operasi 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.
(4) Selesaikan proses naik taraf kunci
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.
