คำหลักที่ผันผวนมีบทบาทที่ค่อนข้างสำคัญในมัลติเธรด Java ฟังก์ชั่นหลักของความผันผวนคือการทำให้ตัวแปรมองเห็นได้ในมัลติเธรดและเป็นกลไกการซิงโครไนซ์ที่เบาที่สุดที่มีให้ใน Java
การมองเห็น
ตัวแปรทั้งหมดในโมเดลหน่วยความจำของ Java (ตัวแปรที่นี่เป็นตัวแปรส่วนกลางไม่ใช่ตัวแปรท้องถิ่นไม่มีปัญหาที่ปลอดภัยจากเธรดในวิธีการเนื่องจากตัวแปรถูกทำลายเนื่องจากวิธีการที่เรียกว่า) จะถูกเก็บไว้ในหน่วยความจำหลัก แต่ละเธรดมีหน่วยความจำในการทำงานของตัวเอง ทุกครั้งที่เธรดดำเนินการสำเนาของตัวแปรจะได้รับจากหน่วยความจำหลักและการทำงานของตัวแปรจะดำเนินการในหน่วยความจำการทำงานของเธรด เธรดที่แตกต่างกันไม่สามารถแชร์หน่วยความจำที่ทำงานได้และสามารถอ่านสำเนาของตัวแปรจากหน่วยความจำหลักเท่านั้น โดยเฉพาะมันสามารถแสดงในรูปด้านล่าง:
อย่างไรก็ตามสำหรับความผันผวน (โดยใช้การปรับเปลี่ยน/การดัดแปลงขั้นสุดท้ายกฎข้างต้นจะเสียนั่นคือเมื่อเธรดปรับเปลี่ยนค่าของตัวแปรเธรดอื่น ๆ สามารถรู้ได้ทันทีการเปลี่ยนแปลงของตัวแปรอย่างไรก็ตามสำหรับตัวแปรทั่วไป สามารถอนุมานได้ว่าตราบใดที่ตัวแปรดัดแปลงโดยความผันผวนนั้นรับประกันได้ว่าตัวแปรนั้นปลอดภัยที่จะทำงานในสภาพแวดล้อมแบบมัลติเธรดเพราะมันสามารถมองเห็นได้ในความทรงจำในการทำงานของกระทู้ทั้งหมด
การทดสอบระดับสาธารณะ {ความผันผวนแบบคงที่ส่วนตัว t = 0; INT แบบคงที่ส่วนตัวเพิ่ม () {return t ++; } public static void testVolatile () {สำหรับ (int i = 0; i <20; i ++) {เธรดเธรด = เธรดใหม่ (()-> {สำหรับ (int j = 0; j <1000; j ++) {เพิ่ม ();}}); thread.start (); } ในขณะที่ (thread.activeCount ()> 1) {thread.yield (); } system.out.println (t); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {testVolatile (); -คาดว่าค่า T ควรเป็น 20,000 แต่จะมีสถานการณ์ที่ค่า T น้อยกว่า 20,000 คุณควรเดาเหตุผล ปัญหาอยู่ใน T ++ T ++ ไม่ใช่การทำงานของอะตอม ใน Java การดำเนินการ T ++ หมายถึงก่อนที่จะได้รับค่า T จากนั้นเพิ่ม 1 จากนั้นกำหนด t เมื่อได้รับค่า T จะถูกแก้ไขโดยความผันผวนดังนั้นค่าล่าสุดของเธรดสามารถรับได้ อย่างไรก็ตามเมื่อเพิ่ม 1 ไม่สามารถรับประกันได้ เป็นไปได้ว่าเธรดอื่น ๆ ได้เพิ่มไปแล้ว 1
ดังนั้นสถานการณ์ใดที่เหมาะสมที่สุดในการใช้ความผันผวน?
* ในการดำเนินการผันแปรไม่ได้ขึ้นอยู่กับค่าปัจจุบัน
* ตัวแปรไม่จำเป็นต้องมีส่วนร่วมในข้อ จำกัด ที่ไม่เปลี่ยนแปลงกับตัวแปรสถานะอื่น ๆ
แปลเป็นภาษาจีนหมายความว่าสำหรับตัวแปรที่มีทั้งการอ่านและเขียนในมัลติเธรดคุณสามารถใช้ความผันผวนเพื่อปรับเปลี่ยน ด้วยวิธีนี้คุณไม่ควรใช้การดำเนินการล็อค/ซิงโครไนซ์สำหรับการดำเนินการอ่าน การอ่านโดยตรงเป็นเพราะตัวแปรสามารถมองเห็นได้