


Mengapakah kata kunci yang tidak menentu perlu ditambahkan pada mod tunggal Java?
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; } }
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(); }
The program di atas Keputusan pelaksanaan adalah seperti berikut:
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(); } }
Hasil pelaksanaan program di atas. adalah seperti berikut:
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; } }
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).
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!

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 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.

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

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
