Disegerakkan ialah kunci tersirat dalam Java, kunci pemerolehan dan kunci pelepas adalah kedua-duanya Ia tersirat dan diserahkan sepenuhnya kepada JVM untuk membantu kami mengendalikannya Sebelum memahami kata kunci Disegerakkan, titik pengetahuan pertama untuk dipelajari ialah struktur objek Java, kerana kunci Disegerakkan disimpan dalam objek Java ditunjukkan dalam rajah di bawah dalam pengepala objek Seterusnya kita akan melakukan analisis ringkas tentang struktur objek:
tanda turun: Medan tanda objek menduduki 8 bait dan digunakan untuk menyimpan maklumat tentang tanda kunci bit. Daripada rajah Dapat dilihat bahawa terdapat nilai hash, bendera kunci ringan, bendera kunci berat sebelah, dll.Apabila status kunci adalah kunci kelas berat (10). Mark-down akan menyimpan penunjuk ke objek Monitor ini juga dipanggil kunci monitor
. Mekanisme pengendalian disegerakkan ialah apabila JVM mengesan situasi persaingan yang berbeza dalam objek kongsi, ia akan bertukar secara automatik kepada pelaksanaan kunci yang sesuai. Pensuisan ini ialah peningkatan atau penurunan taraf kunci. (Banyak tempat mengatakan kunci hanya boleh dinaik taraf, bukan diturunkan. Sebenarnya kenyataan ini salah. Dalam buku "The Art of Java Concurrent Programming", dikatakan untuk kunci bias, ia boleh diturunkan kepada kunci- keadaan bebas, dan juga Ia dipanggil pembatalan kunci berat sebelah).Pada masa ini terdapat tiga pelaksanaan Monitor berbeza, iaitu kunci berat sebelah, kunci ringan dan kunci berat. Apabila benang memegang Monitor, ia memperoleh kunci.
Monitor dalam Java dilaksanakan berdasarkan ObjectMonitor C++ Ahli utamanya termasuk: _owner: menunjuk ke benang yang memegang objek ObjectMonitor <.>Seperti yang dapat dilihat daripada huraian di atas, kunci untuk mendapatkan kunci dengan kata kunci yang disegerakkan terletak pada pengepala objek setiap objek Ini juga menerangkan sebab mana-mana objek yang disimpan dalam kurungan disegerakkan () boleh mendapatkan kunci ciri.
Atomicity
Atomicity bermaksud operasi sama ada selesai atau tidak selesai, yang bermaksud bahawa operasi ini tidak boleh dilakukan. tergendala.
public static void add() { synchronized (Demo.class) { counter++; } }
Nyah susun dan lihat kod:
javap -v -p Demo
public static void add(); descriptor: ()V flags: ACC_PUBLIC, ACC_STATIC , ACC_SYNCHRONIZED Code: stack=2, locals=2, args_size=0 0: ldc #12 // class 2: dup 3: astore_0 4: monitorenter 5: getstatic #10 // Field counter:I 8: iconst_1 9: iadd 10: putstatic #10 // Field counter:I 13: aload_0 14: monitorexit 15: goto 23 18: astore_1 19: aload_0 20: monitorexit 21: aload_1 22: athrow 23: return Exception table:
Anda boleh lihat bahawa terdapat dua arahan yang jelas berkaitan dengan pemantauan:
monitorenter: Selepas menilai bahawa ia mempunyai bendera penyegerakan ACC_SYNCHRONIZED, utas yang memasuki kaedah ini terlebih dahulu akan mempunyai pemilik Monitor terlebih dahulu Pada masa ini, kaunter + 1
monitorexit: Apabila Selepas pelaksanaan dan keluar, kaunter -1, kembali kepada 0 dan diperolehi oleh urutan masuk lain
Keterlihatan merujuk kepada apabila berbilang benang mengakses yang sama Apabila pembolehubah digunakan, jika satu utas mengubah suai nilai pembolehubah, utas lain boleh merasakannya dengan serta-merta dan melihat nilai yang diubah suai. Keterlihatan benang berkait rapat dengan JMM. Dalam artikel seterusnya, kami akan meneroka cara menggunakan kata kunci yang tidak menentu untuk mencapai keterlihatan
dan Synchronized mempunyai keterlihatan kerana ia mempunyai semantik berikut untuk mengunci dan melepaskan kunci:
Sebelum benang dikunci, ia mesti mengosongkan nilai pembolehubah kongsi dalam memori kerja dan membaca nilai terkini pembolehubah kongsi daripada memori utama.
Apabila benang melepaskan kunci, nilai pembolehubah kongsi mesti dimuat semula ke dalam ingatan utama.
Keterlihatan disegerakkan bergantung pada pelaksanaan kernel mutex sistem pengendalian, yang bersamaan dengan mengunci dan membuka kunci dalam JVM Apabila keluar dari blok kod, pembolehubah yang dikongsi perlu dimuat semula memori utama. Perkara ini Tidak seperti kata kunci yang tidak menentu, keterlihatan kata kunci yang tidak menentu bergantung pada halangan memori (juga dipanggil halangan memori).
seolah-olah bersiri bermakna tidak kira bagaimana pengkompil dan pemproses menyusun semula arahan untuk pengoptimuman prestasi, ia perlu dijamin Ketepatan keputusan berjalan di bawah satu utas . Maksudnya: Jika anda memerhati dalam urutan ini, semua operasi adalah teratur, Jika anda memerhatikan urutan lain dalam satu urutan, semua operasi tidak teratur.
Perhatikan bahawa pesanan di sini berbeza daripada tidak menentu. Ia tidak menentu untuk menghalang pesanan semula arahan.
Konsep kunci masuk semula adalah sangat mudah, iaitu, benang boleh memperoleh kunci objek yang dipegangnya beberapa kali Kunci jenis ini ialah kunci Pelepas yang sama kunci juga memerlukan melepaskan bilangan kunci yang sama. Dalam objek kunci yang disegerakkan, terdapat pembilang yang digunakan untuk merekodkan bilangan kali kunci diperoleh, iaitu bilangan kemasukan semula.
Kunci disegerakkan mempunyai empat keadaan naik taraf alternatif: tiada kunci, kunci berat sebelah, kunci ringan dan kelas berat Keadaan ini meningkat secara beransur-ansur dengan persaingan ,Kunci lengkap rajah naik taraf akan ditambah kemudian.
Atas ialah kandungan terperinci Apakah prinsip Synchronized in Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!