Banyak teman mungkin pernah mendengar kata kunci yang mudah menguap dan mungkin telah menggunakannya. Sebelum Java 5, itu adalah kata kunci yang kontroversial, karena menggunakannya dalam program sering menghasilkan hasil yang tidak terduga. Hanya setelah Java 5, kata kunci yang mudah menguap mendapatkan kembali vitalitasnya.
Fungsi kata kunci yang mudah menguap adalah membuat semua utas dalam sistem berbagi terlihat oleh variabel yang dimodifikasi oleh kata kunci, dan dapat melarang memori kerja utas dari variabel cache yang dimodifikasi oleh volatile.
Volatile 2 Skenario Penggunaan:
1. Visibilitas: Java menyediakan kata kunci yang mudah menguap untuk memastikan visibilitas.
Ketika variabel bersama dimodifikasi dengan volatile, itu memastikan bahwa nilai yang dimodifikasi akan segera diperbarui ke memori utama, dan ketika utas lain perlu membacanya, itu akan membaca nilai baru dalam memori.
Namun, variabel bersama biasa tidak dapat menjamin visibilitas, karena tidak pasti kapan variabel bersama normal ditulis ke memori utama setelah dimodifikasi. Ketika utas lain membacanya, nilai lama asli mungkin masih ada dalam memori, sehingga visibilitas tidak dapat dijamin.
Selain itu, sinkronisasi dan kunci juga dapat memastikan visibilitas. Sinkronisasi dan kunci dapat memastikan bahwa hanya satu utas yang memperoleh kunci pada waktu yang sama dan menjalankan kode sinkronisasi. Sebelum melepaskan kunci, modifikasi variabel akan disegarkan ke memori utama. Oleh karena itu, visibilitas dapat dijamin.
Mari kita lihat sepotong kode terlebih dahulu. Jika utas 1 dieksekusi terlebih dahulu dan utas 2 dieksekusi nanti:
// Thread 1Boolean stop = false; while (! stop) {dosomething ();} // thread 2stop = true;Kode ini adalah kode yang sangat khas, dan banyak orang dapat menggunakan metode markup ini saat mengganggu utas. Namun pada kenyataannya, akankah kode ini berjalan dengan benar? Apakah utas akan terganggu? Belum tentu. Mungkin sebagian besar waktu, kode ini dapat mengganggu utas, tetapi juga dapat menyebabkan utas tidak terganggu (meskipun kemungkinan ini sangat kecil, begitu ini terjadi, itu akan menyebabkan loop mati).
Mari kita jelaskan mengapa kode ini dapat menyebabkan utas gagal mengganggu. Seperti yang dijelaskan sebelumnya, setiap utas memiliki memori kerjanya sendiri selama operasi, jadi ketika utas 1 sedang berjalan, ia akan menyalin nilai variabel berhenti dan memasukkannya ke dalam memori kerjanya sendiri.
Kemudian ketika Thread 2 mengubah nilai variabel berhenti, tetapi belum punya waktu untuk menulisnya ke memori utama, Thread 2 pergi untuk melakukan hal -hal lain, maka Thread 1 tidak tahu tentang perubahan Thread 2 ke variabel berhenti, sehingga akan terus melingkar.
Tetapi setelah memodifikasi dengan volatile itu menjadi berbeda:
Pertama: menggunakan kata kunci yang mudah menguap akan memaksa nilai yang dimodifikasi untuk segera ditulis ke memori utama;
Kedua: jika Anda menggunakan kata kunci yang mudah menguap, ketika Thread 2 memodifikasinya, garis cache dari variabel cache berhenti di memori kerja Thread 1 akan tidak valid (jika tercermin dalam lapisan perangkat keras, garis cache yang sesuai dalam cache L1 atau L2 dari CPU tidak valid);
Ketiga: Karena garis cache dari variabel cache berhenti dalam memori kerja Thread 1 tidak valid, utas 1 akan membacanya di memori utama ketika membaca nilai variabel berhenti lagi.
Kemudian ketika Thread 2 memodifikasi nilai berhenti (tentu saja, ada 2 operasi di sini, memodifikasi nilai dalam memori kerja Thread 2, dan kemudian menulis nilai yang dimodifikasi ke memori), garis cache dari variabel cache berhenti di memori kerja Thread 1 akan tidak valid. Ketika Thread 1 membaca, ia menemukan bahwa garis cache tidak valid. Ini akan menunggu alamat memori utama yang sesuai dari jalur cache diperbarui, dan kemudian membaca nilai terbaru di memori utama yang sesuai.
Lalu apa yang dibaca utas 1 adalah nilai yang benar terbaru.
2. Pastikan ketertiban
volatile boolean inisiated = false; // thread 1: context = loadContext (); diinisiasi = true; // Thread 2: while (! Inited) {sleep ()} dosomethingwithconfig (konteks);Pastikan konteksnya telah diinisialisasi.
3. Pemeriksaan Ganda
class singleton {private volatile static singleton instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {disinkronkan (singleton.class) {if (instance == null) instance = new singleton ();}} return;}}}}}}}}}}}}}} {if (instance =Di atas adalah penjelasan terperinci tentang peran dan penggunaan kata kunci yang mudah menguap di Java yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!