Rumah  >  Artikel  >  Java  >  Apakah prinsip Synchronized in Java

Apakah prinsip Synchronized in Java

王林
王林ke hadapan
2023-05-31 14:55:141705semak imbas

    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++;
        }
    }

    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!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
    Artikel sebelumnya:Apakah teknologi canggih Java?Artikel seterusnya:Apakah teknologi canggih Java?