Rumah >Java >javaTutorial >Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

王林
王林ke hadapan
2023-05-11 15:25:06762semak imbas

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:

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

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

Proses demonstrasi adalah seperti berikut:

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

(2) Kunci ringan→ Kunci berat
Disebabkan benang yang gagal diperoleh kunci Ia akan berputar, dan putaran jangka panjang akan menggunakan sumber CPU Oleh itu, jika ia berputar untuk beberapa kali, kunci akan dinaik taraf daripada kunci ringan kepada kunci kelas berat.

Kunci heavyweight dilaksanakan melalui pemantau objek, yang termasuk senarai masuk (kumpulan kunci), pemilik (pemegang kunci), waitSet (set tunggu), dsb.

Apabila menaik taraf kepada kunci kelas berat, kandungan perkataan tanda pengepala objek ialah alamat monitor (alamat monitor objek), menunjuk ke monitor objek.

Proses demonstrasi adalah seperti berikut:

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

Nota: Benang yang gagal mencengkam kunci akan memasuki senarai entri (kolam kunci). kaedah tunggu, benang akan memasuki waitSet( Wait set), thread dalam waitSet akan memasuki semula entryList selepas dikejutkan.

(3) Berkenaan kunci berat sebelah
tidak membuka kunci selepas dikunci buka kunci, yang dikurangkan→Pemprosesan perniagaan→Lepaskan kunci→Proses operasi kunci.

Selepas JDK6, pengoptimuman kunci pincang didayakan secara lalai Kunci pincang dilumpuhkan melalui parameter JVM

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.

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam