เรารู้ว่าการดำเนินการตั้งค่าตัวแปรใน Java นั้นเป็นการดำเนินการแบบอะตอมมิก ยกเว้นตัวแปรชนิดยาวและแบบคู่ กล่าวอีกนัยหนึ่ง ไม่จำเป็นต้องซิงโครไนซ์การดำเนินการอ่านและเขียนค่าตัวแปรแบบธรรมดา
ก่อน JVM 1.2 การใช้งานโมเดลหน่วยความจำของ Java จะอ่านตัวแปรจากหน่วยความจำหลักเสมอ ซึ่งไม่ต้องการการดูแลเป็นพิเศษ ด้วยความสมบูรณ์และการออปติไมซ์ของ JVM การใช้คีย์เวิร์ดที่เปลี่ยนแปลงได้จึงมีความสำคัญมากในสภาพแวดล้อมแบบมัลติเธรด ภายใต้โมเดลหน่วยความจำ Java ปัจจุบัน เธรดสามารถจัดเก็บตัวแปรในหน่วยความจำภายในเครื่อง (เช่น การลงทะเบียนเครื่อง) แทนที่จะอ่านและเขียนโดยตรงในหน่วยความจำหลัก ซึ่งอาจทำให้เธรดหนึ่งแก้ไขค่าของตัวแปรในหน่วยความจำหลัก ในขณะที่เธรดอื่นยังคงใช้สำเนาของค่าตัวแปรในรีจิสเตอร์ ทำให้ข้อมูลไม่สอดคล้องกัน เพื่อแก้ไขปัญหานี้ คุณเพียงแค่ต้องประกาศตัวแปรว่ามีความผันผวน (ไม่เสถียร) เช่นเดียวกับในโปรแกรมนี้ สิ่งนี้บ่งชี้ให้ JVM ว่าตัวแปรนี้ไม่เสถียรและจะถูกจัดเก็บไว้ในหน่วยความจำหลักทุกครั้งที่ใช้ในการอ่าน พูดโดยทั่วไป
ดังนั้นในสภาพแวดล้อมแบบมัลติทาสกิ้ง แฟล็กที่ใช้ร่วมกันระหว่างงานควรได้รับการแก้ไขโดยมีความผันผวน
แต่ละครั้งที่มีการเข้าถึงตัวแปรสมาชิกที่แก้ไขโดย Volatile โดยเธรด ค่าของตัวแปรสมาชิกจะถูกบังคับให้อ่านซ้ำจากหน่วยความจำแบบแบ่งใช้ นอกจากนี้ เมื่อตัวแปรสมาชิกเปลี่ยนแปลง เธรดจะถูกบังคับให้เขียนค่าที่เปลี่ยนแปลงกลับไปยังหน่วยความจำแบบแบ่งใช้ ด้วยวิธีนี้ เมื่อใดก็ได้ สองเธรดที่แตกต่างกันจะเห็นค่าเดียวกันของตัวแปรสมาชิกเสมอ
สถานะข้อกำหนดภาษา Java: เพื่อความเร็วที่เหมาะสมที่สุด เธรดจะได้รับอนุญาตให้บันทึกสำเนาส่วนตัวของตัวแปรสมาชิกที่แชร์ และเปรียบเทียบกับค่าดั้งเดิมของตัวแปรสมาชิกที่แชร์เฉพาะเมื่อเธรดเข้าหรือออกจากบล็อกโค้ดที่ซิงโครไนซ์
ด้วยวิธีนี้ เมื่อหลายเธรดโต้ตอบกับอ็อบเจ็กต์ในเวลาเดียวกัน จะต้องให้ความสนใจกับการอนุญาตให้เธรดรับการเปลี่ยนแปลงในตัวแปรสมาชิกที่แบ่งใช้ในเวลาที่เหมาะสม
คำสำคัญระเหยจะแจ้ง VM: ไม่สามารถบันทึกสำเนาส่วนตัวของตัวแปรสมาชิกนี้ได้ แต่ควรโต้ตอบโดยตรงกับตัวแปรสมาชิกที่แชร์
คำแนะนำการใช้งาน: ใช้ความผันผวนกับตัวแปรสมาชิกที่เข้าถึงโดยเธรดตั้งแต่สองเธรดขึ้นไป ไม่จำเป็นต้องใช้เมื่อตัวแปรที่จะเข้าถึงมีอยู่แล้วในบล็อคโค้ดที่ซิงโครไนซ์หรือเป็นค่าคงที่
เนื่องจากการใช้ volatile จะบล็อกการเพิ่มประสิทธิภาพโค้ดที่จำเป็นใน VM จึงมีประสิทธิภาพน้อยลง ดังนั้นคีย์เวิร์ดนี้จึงต้องใช้เมื่อจำเป็นเท่านั้น
ในการใช้งานเครื่องเสมือน ประเภทพื้นฐาน เช่น int และ char มีความยาวเพียงคำเดียว และยาวและสองครั้งครอบครองความยาวสองคำ ในการใช้งานเครื่องเสมือน บาง เครื่อง ความยาวของคำทั้งสอง อาจ ถือเป็นความยาวของคำเดียวแบบปรมาณูสองคำ
หาก long และ double ไม่ได้รับการแก้ไขโดยมีความผันผวน หากมีเธรดหลายตัวเข้าถึงตัวแปร ผลลัพธ์จะทำให้เกิดความสับสนเนื่องจากการดำเนินการแบบยาวโดยรวมไม่เป็นแบบอะตอมมิก
ตัวอย่างเช่น: int เธรดหนึ่งเขียน 4 และอีกเธรดเขียน 5 ค่าสุดท้ายต้องเป็น 4 หรือ 5 และชนิดยาวอาจเป็นค่าที่ยุ่งเหยิง