Jadual Kandungan
1. Fungsi meruap
1.1 Masalah keterlihatan ingatan
1.2 Mencegah penyusunan semula arahan
2. Mengapa menggunakan volatile?
Rumah Java javaTutorial Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal Java?

Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal Java?

Apr 19, 2023 pm 02:40 PM
java volatile

    Kata Pengantar:

    Terdapat banyak cara untuk melaksanakan mod tunggal, seperti mod lapar, mod malas, kelas dalaman statik dan penghitungan, dsb., apabila penemuduga bertanya "Mengapa mesti tidak menentu ditambah kepada mod tunggal?", maka dia merujuk kepada mengapa pembolehubah persendirian dalam mod malas perlu tidak menentu?

    Mod malas merujuk kepada kaedah pemuatan malas bagi penciptaan objek Objek tidak dicipta apabila atur cara bermula, tetapi dicipta hanya apabila ia benar-benar digunakan untuk kali pertama.

    Adakah anda ingin menjelaskan mengapa anda perlu menambah tidak menentu? Mari kita lihat kod pelaksanaan khusus mod malas:

    public class Singleton {
        // 1.防止外部直接 new 对象破坏单例模式
        private Singleton() {}
        // 2.通过私有变量保存单例对象【添加了 volatile 修饰】
        private static volatile Singleton instance = null;
        // 3.提供公共获取单例对象的方法
        public static Singleton getInstance() {
            if (instance == null) { // 第 1 次效验
                synchronized (Singleton.class) {
                    if (instance == null) { // 第 2 次效验
                        instance = new Singleton(); 
                    }
                }
            }
            return instance;
        }
    }
    Salin selepas log masuk

    Seperti yang dapat dilihat dari kod di atas, untuk memastikan keselamatan benang dan prestasi tinggi, jika dan disegerakkan digunakan dua kali dalam kod untuk memastikan bahawa pelaksanaan program. Oleh itu, kerana sudah ada disegerakkan untuk memastikan keselamatan benang, mengapa kita perlu menambah tidak menentu pada pembolehubah? Sebelum menjelaskan masalah ini, kita mesti terlebih dahulu memahami pengetahuan prasyarat: Apakah kegunaan volatile?

    1. Fungsi meruap

    meruap mempunyai dua fungsi utama, pertama, ia menyelesaikan masalah keterlihatan memori, dan kedua, ia menghalang penyusunan semula arahan.

    1.1 Masalah keterlihatan ingatan

    Masalah keterlihatan memori yang dipanggil merujuk kepada apabila berbilang benang mengendalikan pembolehubah pada masa yang sama Selepas satu utas mengubah nilai pembolehubah, yang lain benang Pengubahsuaian pembolehubah tidak dapat dilihat, yang merupakan masalah keterlihatan memori. Menggunakan volatile boleh menyelesaikan masalah keterlihatan memori , sebagai contoh, kod berikut, apabila tidak menentu tidak ditambah, pelaksanaannya adalah seperti berikut:

    private static boolean flag = false;
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // 如果 flag 变量为 true 就终止执行
                while (!flag) {
    
                }
                System.out.println("终止执行");
            }
        });
        t1.start();
        // 1s 之后将 flag 变量的值修改为 true
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("设置 flag 变量的值为 true!");
                flag = true;
            }
        });
        t2.start();
    }
    Salin selepas log masuk

    The program di atas Keputusan pelaksanaan adalah seperti berikut:

    Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal Java?

    Walau bagaimanapun, selepas program di atas telah dilaksanakan selama N kali, ia masih belum berakhir benang 2 mengubah suai pembolehubah bendera, utas 1 Pengubahsuaian pembolehubah tidak dilihat sama sekali.

    Kemudian seterusnya, kami cuba menambah tidak menentu pada bendera Kod pelaksanaan adalah seperti berikut:

    public class volatileTest {
        private static volatile boolean flag = false;
        public static void main(String[] args) {
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    // 如果 flag 变量为 true 就终止执行
                    while (!flag) {
    
                    }
                    System.out.println("终止执行");
                }
            });
            t1.start();
            // 1s 之后将 flag 变量的值修改为 true
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("设置 flag 变量的值为 true!");
                    flag = true;
                }
            });
            t2.start();
        }
    }
    Salin selepas log masuk

    Hasil pelaksanaan program di atas. adalah seperti berikut:

    Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal Java?

    Daripada keputusan pelaksanaan di atas, kita dapat melihat bahawa menggunakan volatile boleh menyelesaikan masalah keterlihatan memori dalam program.

    1.2 Mencegah penyusunan semula arahan

    Penyusunan semula arahan bermakna semasa pelaksanaan atur cara, pengkompil atau JVM sering menyusun semula arahan untuk meningkatkan prestasi pelaksanaan atur cara. Niat reka bentuk asal bagi penyusunan semula arahan sememangnya sangat baik, dan ia juga boleh memainkan peranan yang besar dalam satu utas Walau bagaimanapun, dalam berbilang benang, menggunakan penyusunan semula arahan boleh menyebabkan isu keselamatan benang.

    Masalah keselamatan benang yang dipanggil bermakna hasil pelaksanaan program tidak selaras dengan jangkaan kami. Sebagai contoh, jika hasil yang betul yang kami jangkakan ialah 0, tetapi hasil pelaksanaan program ialah 1, maka ini adalah isu keselamatan rangkaian.

    Menggunakan meruap boleh melarang penyusunan semula arahan, dengan itu memastikan program boleh dilaksanakan dengan betul apabila berjalan dalam berbilang rangkaian.

    2. Mengapa menggunakan volatile?

    Kembali kepada topik, kami menggunakan tidak menentu dalam mod tunggal, terutamanya kerana meruap boleh melarang penyusunan semula arahan, dengan itu memastikan operasi normal program . Sesetengah pembaca mungkin bertanya soalan di sini, bukankah disegerakkan sudah digunakan untuk memastikan keselamatan benang? Jadi mengapa menambah tidak menentu? Lihat kod di bawah:

    public class Singleton {
        private Singleton() {}
        // 使用 volatile 禁止指令重排序
        private static volatile Singleton instance = null;
        public static Singleton getInstance() {
            if (instance == null) { // ①
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton(); // ②
                    }
                }
            }
            return instance;
        }
    }
    Salin selepas log masuk

    Perhatikan kod di atas saya menandakan dua baris kod pada ① dan ②. Menambah tidak menentu pada pembolehubah persendirian adalah terutamanya untuk menghalang penyusunan semula arahan semasa pelaksanaan ②, iaitu, pelaksanaan "instance = new Singleton()" ini objek, tetapi ia Pelaksanaan sebenar dibahagikan kepada 3 langkah berikut:

    • Buat ruang memori.

    • Mulakan objek Singleton dalam ruang ingatan.

    • Tetapkan alamat memori kepada objek contoh (selepas melaksanakan langkah ini, contoh tidak akan sama dengan nol).

    Bayangkan sahaja,

    jika tidak menentu tidak ditambah, maka benang 1 boleh melakukan penyusunan semula arahan apabila melaksanakan ② kod di atas, menukar susunan pelaksanaan asal bagi 1, 2, dan 3 disusun semula kepada 1, 3, dan 2. Tetapi dalam keadaan istimewa, selepas utas 1 telah melaksanakan langkah 3, jika utas 2 datang dan melaksanakan langkah pertama kod di atas, ia dinilai bahawa objek contoh tidak batal, tetapi utas 1 belum selesai membuat instantiat objek Kemudian Thread 2 akan mendapat objek "separuh" yang dijadikan instantiated, menyebabkan ralat pelaksanaan program Inilah sebabnya mengapa tidak menentu ditambahkan pada pembolehubah persendirian.

    Atas ialah kandungan terperinci Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal 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)
    1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Akan R.E.P.O. Ada Crossplay?
    1 bulan 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.

    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.

    Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

    Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

    Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

    Spring Boot memudahkan penciptaan aplikasi Java yang mantap, berskala, dan siap pengeluaran, merevolusi pembangunan Java. Pendekatan "Konvensyen Lebih Konfigurasi", yang wujud pada ekosistem musim bunga, meminimumkan persediaan manual, Allo

    See all articles