Kita tahu bahwa operasi pengaturan nilai variabel di Java adalah operasi atomik kecuali untuk variabel tipe panjang dan ganda, dengan kata lain, tidak perlu menyinkronkan operasi baca dan tulis sederhana dari nilai variabel.
Sebelum JVM 1.2, implementasi model memori Java selalu membaca variabel dari memori utama, sehingga tidak memerlukan perhatian khusus. Dengan kematangan dan optimalisasi JVM, penggunaan kata kunci yang mudah menguap menjadi sangat penting dalam lingkungan multi-thread. Di bawah model memori Java saat ini, thread dapat menyimpan variabel di memori lokal (seperti register mesin) alih-alih langsung membaca dan menulis di memori utama. Hal ini dapat menyebabkan satu thread mengubah nilai variabel di memori utama, sementara thread lain terus menggunakan salinan nilai variabelnya di register, sehingga menyebabkan ketidakkonsistenan data. Untuk mengatasi masalah ini, Anda hanya perlu mendeklarasikan variabel sebagai volatil (tidak stabil) seperti pada program ini. Hal ini menunjukkan kepada JVM bahwa variabel ini tidak stabil dan akan disimpan di memori utama setiap kali digunakan untuk dibaca. Secara umum
Oleh karena itu, dalam lingkungan multitasking, flag yang dibagikan antar tugas harus dimodifikasi dengan volatil.
Setiap kali variabel anggota yang dimodifikasi oleh Volatile diakses oleh thread, nilai variabel anggota dipaksa untuk dibaca ulang dari memori bersama. Selain itu, ketika variabel anggota berubah, thread dipaksa untuk menulis nilai yang diubah kembali ke memori bersama. Dengan cara ini, setiap saat, dua thread berbeda selalu melihat nilai variabel anggota yang sama.
Spesifikasi Bahasa Java menyatakan: Untuk kecepatan optimal, thread diperbolehkan menyimpan salinan pribadi variabel anggota bersama dan membandingkannya dengan nilai asli variabel anggota bersama hanya ketika thread memasuki atau meninggalkan blok kode yang disinkronkan.
Dengan cara ini, ketika beberapa thread berinteraksi dengan suatu objek pada saat yang sama, perhatian harus diberikan untuk memungkinkan thread memperoleh perubahan dalam variabel anggota bersama secara tepat waktu.
Kata kunci volatil meminta VM: ia tidak dapat menyimpan salinan pribadi variabel anggota ini, namun harus berinteraksi langsung dengan variabel anggota bersama.
Saran penggunaan: Gunakan volatil pada variabel anggota yang diakses oleh dua atau lebih thread. Tidak perlu digunakan ketika variabel yang akan diakses sudah berada dalam blok kode yang disinkronkan atau merupakan konstanta.
Karena penggunaan volatil memblokir pengoptimalan kode yang diperlukan di VM, hal ini kurang efisien, sehingga kata kunci ini harus digunakan hanya jika diperlukan.
Dalam implementasi mesin virtual, tipe dasar seperti int dan char panjangnya satu kata. Dan panjang dan ganda menempati dua kata panjangnya. Dalam beberapa implementasi mesin virtual, panjang dua kata dapat diperlakukan sebagai dua panjang kata atom tunggal.
Jika long dan double tidak diubah dengan volatil, jika banyak thread mengakses variabel, hasilnya akan membingungkan karena keseluruhan operasi panjang yang non-atomisitas.
Misalnya: int, satu thread menulis 4, dan thread lainnya menulis 5. Nilai akhir harus 4 atau 5. Dan tipe yang panjang mungkin nilainya berantakan.