Apakah prinsip Synchronized in Java
Analisis tahap kod sumber Disegerakkan
Struktur objek
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:
- Penuding Kelas: Penunjuk jenis objek Kelas, yang merupakan penuding kepunyaan Kelas objek semasa Secara lalai, jdk1.8 menghidupkan penuding termampat dan menduduki 4 bait. Matikan penunjuk termampat.
- Data sebenar objek: Bahagian ini merangkumi semua pembolehubah ahli objek. Saiz ditentukan oleh setiap pembolehubah ahli Contohnya, bait menduduki 1 bait, int menduduki 4 bait. dll.
- Isikannya: Bahagian kandungan ini hanya untuk penyiapan ruang dan berfungsi sebagai pemegang tempat, kerana sistem pengurusan memori mesin maya HotSpot memerlukan alamat permulaan objek mestilah Ia adalah gandaan integer 8 bait, jadi jika contoh objek tidak sejajar, ia perlu berlapik.
- Dalam teg jenis kunci mark-down, anda dapat melihat bahawa terdapat lima jenis, iaitu kunci bebas kunci, kunci berat sebelah, kunci ringan, kunci heavyweight dan tanda GC . Oleh itu, ia tidak boleh dinyatakan sepenuhnya jika hanya tanda 2-bit digunakan, jadi tanda kunci bias diperkenalkan, iaitu, 001 bermaksud tiada kunci dan 101 bermaksud kunci bias. Objek Pantau
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 <.>- _WaitSet: menyimpan baris gilir benang dalam keadaan menunggu, iaitu, benang yang memanggil kaedah tunggu()
- _EntryList: menyimpan baris gilir benang dalam kunci menunggu Keadaan sekat
- _count: Anggaran jumlah bilangan nod dalam _WaitSet+_EntryList
- _cxq: Berbilang benang yang bersaing untuk kunci akan terlebih dahulu simpan pesanan ini Senarai terpaut
- _rekursi: rekod bilangan kemasukan semula
- _objek: objek Monitor disimpan
- Apabila utas yang memperoleh objek Monitor memasuki kawasan _owner, _count+1 Jika utas memanggil kaedah tunggu(), objek Monitor akan dilepaskan (kunci dilepaskan), dan _owner akan dipulihkan kepada kosong. dan _count-1. Pada masa ini, benang memasuki baris gilir _WaitSet, menunggu untuk dibangkitkan.
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.
Ciri Tersegerak
Atomicity
Atomicity bermaksud operasi sama ada selesai atau tidak selesai, yang bermaksud bahawa operasi ini tidak boleh dilakukan. tergendala.
disegerakkan boleh memastikan hanya satu utas mendapat kunci pada masa yang sama dan memasuki blok kod untuk melaksanakan kod Jika anda tidak memahami perkara ini, bayangkan pemandangan berikut hanya ada satu lubang, dan Tandas juga dikunci untuk mengelakkan fenomena tidak beradab ramai orang pergi ke tandas pada masa yang sama Setiap orang yang menggunakan tandas mesti pergi ke pentadbir tandas untuk membayar, anda boleh mendapatkan kunci sebelum pergi ke tandas selepas menggunakan tandas, anda boleh mengembalikannya kepada pengurus tandas, disegerakkan adalah pengurus tandas, memastikan hanya seorang yang boleh mendapatkan kunci pada satu-satu masa, dan semua orang mesti memulangkan kunci selepas menggunakan tandas.
Seterusnya, lihat kaedah penambahan segerak berikut:
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
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).
Keteraturan
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.
Kunci masuk semula
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.
Proses peningkatan kunci
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!

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.
