Jadual Kandungan
Analisis tahap kod sumber Disegerakkan
Struktur objek
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:
Keterlihatan
Keteraturan
Kunci masuk semula
Proses peningkatan kunci
Rumah Java javaTutorial Apakah prinsip Synchronized in Java

Apakah prinsip Synchronized in Java

May 31, 2023 pm 02:55 PM
java synchronized

    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:

    Apakah prinsip Synchronized in Java

    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.

    • 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
    Struktur objek diperkenalkan di atas anda boleh melihat bahawa maklumat kunci yang berbeza akan disimpan dalam Tanda-turun

    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++;
        }
    }
    Salin selepas log masuk

    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:
    Salin selepas log masuk

    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!

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Cara Membuka Segala -galanya Di Myrise
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

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

    Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

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

    Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

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

    Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

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

    Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

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

    Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

    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

    TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

    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.

    Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Oct 13, 2024 pm 01:32 PM

    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.

    See all articles