Kata kunci yang mudah menguap memainkan peran yang relatif penting dalam java multi-threading. Fungsi utama volatil adalah menjaga variabel terlihat dalam multi-threading dan merupakan mekanisme sinkronisasi paling ringan yang disediakan dalam Java.
Visibilitas
Semua variabel dalam model memori Java (variabel di sini adalah variabel global, bukan variabel lokal. Tidak ada masalah yang aman-utas dalam metode ini, karena variabel dihancurkan seperti metode ini disebut) disimpan dalam memori utama. Setiap utas memiliki memori kerjanya sendiri. Setiap kali utas dieksekusi, salinan variabel akan diperoleh dari memori utama, dan pengoperasian variabel akan dilakukan dalam memori kerja utas. Thread yang berbeda tidak dapat berbagi memori yang berfungsi, dan hanya dapat membaca salinan variabel dari memori utama. Secara khusus, dapat diekspresikan dalam gambar di bawah ini:
However, for volatile (using synchronized/final modifications, the above rule is broken, that is, when the thread modifies the value of the variable, other threads can immediately know the change of the variable. However, for ordinary variables, when a thread modifies a variable, it is necessary to write the variable back to the main memory first, and other threads will only be visible to the thread after reading the variable from the main memory. It seems that from the above description, it Dapat disimpulkan bahwa selama variabel yang dimodifikasi oleh volatile digunakan, dijamin bahwa variabel ini aman untuk beroperasi di lingkungan multi-threaded, karena itu terlihat dengan memori kerja semua utas, yaitu, konsisten dalam beberapa jaminan, tetapi banyak operasi yang tidak dapat diamalkan.
tes kelas publik {private static volatile t = 0; private static int add () {return t ++; } public static void testVolatile () {for (int i = 0; i <20; i ++) {thread thread = thread baru (()-> {for (int j = 0; j <1000; j ++) {add ();}}); thread.start (); } while (thread.activeCount ()> 1) {thread.yield (); } System.out.println (t); } public static void main (string [] args) {testVolatile (); }}Diharapkan bahwa nilai T harus 20.000, tetapi akan ada situasi di mana nilai T kurang dari 20.000. Anda harus menebak alasannya. Masalahnya terletak pada T ++. T ++ bukan operasi atom. Di Java, operasi T ++ berarti terlebih dahulu untuk mendapatkan nilai t, kemudian tambahkan 1, dan kemudian tetapkan t. Saat mendapatkan nilai T, itu dimodifikasi dengan volatile, sehingga nilai terbaru dari utas dapat diperoleh. Namun, saat menambahkan 1, itu tidak dapat dijamin. Ada kemungkinan bahwa utas lain telah menambahkan 1.
Jadi skenario mana yang paling cocok untuk digunakan volatile?
* Dalam operasi variabel tidak tergantung pada nilai saat ini
* Variabel tidak perlu berpartisipasi dalam kendala invarian dengan variabel negara lain
Diterjemahkan ke dalam bahasa Cina berarti bahwa untuk variabel yang telah membaca dan menulis dalam multi-thread, Anda dapat menggunakan volatile untuk memodifikasinya. Dengan cara ini, Anda tidak boleh menggunakan operasi kunci/disinkronkan untuk operasi baca. Membaca secara langsung adalah karena variabel terlihat.