ฉันมีคำถามเกี่ยวกับการมองเห็นใน java การมองเห็นสามารถปรากฏได้ก็ต่อเมื่อเรามีอย่างน้อยสองเธรดซึ่งทำงานบนคอร์ซีพียูอย่างน้อย 2 คอร์ ใช่มั้ยล่ะ? ทุกคอร์สามารถแคชตัวแปรในรีจิสเตอร์และหน่วยความจำแคชได้ และเนื่องจากปัญหาการมองเห็นนั้นจึงอาจปรากฏขึ้นได้ แต่จะเป็นอย่างไรถ้าเรามี n เธรดและเธรดทั้งหมดทำงานใน cpu core ตัวเดียว (แน่นอนว่าเราไม่สามารถแน่ใจได้ว่าเธรดเหล่านั้นจะทำงานบน 1 คอร์เท่านั้น แต่สมมติว่าเป็นไปได้ที่จะบรรลุเป้าหมายนั้น) ไม่มีทางที่จะ มีการมองเห็นความทรงจำไหม? หรือนี่ไม่ถูกต้อง? ขอบคุณล่วงหน้า.
การมองเห็นการทำงานพร้อมกันของ Java
คำตอบ (2)
หากโดยการมองเห็นคุณอ้างถึงหน่วยความจำที่ใช้ร่วมกัน ดังนั้นออบเจ็กต์ที่สร้างหรือแก้ไขในเธรดหนึ่งอาจมองเห็นได้ในอีกเธรดหนึ่ง ไม่สำคัญว่าจะมีกี่คอร์ การมองเห็นจะยังคงเหมือนเดิม Java ให้สัญญาตามข้อกำหนดภาษา Java โดยเฉพาะ โมเดลหน่วยความจำ Java ที่ต้องปฏิบัติตามโดยไม่คำนึงถึงจำนวนคอร์
แต่จะเป็นอย่างไรถ้าเรามี n เธรดและเธรดทั้งหมดทำงานใน cpu core ตัวเดียว (แน่นอนว่าเราไม่สามารถแน่ใจได้ว่าเธรดเหล่านั้นจะทำงานบน 1 คอร์เท่านั้น แต่สมมติว่าเป็นไปได้ที่จะบรรลุเป้าหมายนั้น) ไม่มีทางที่จะ มีการมองเห็นความทรงจำไหม? หรือนี่ไม่ถูกต้อง?
ใช่ การมองเห็น (หน่วยความจำที่ใช้ร่วมกัน) ยังคงมีอยู่หากมี n เธรดที่ทำงานบนคอร์เดียว แต่มีข้อแม้บางประการที่มีอยู่ไม่ว่าจะมีกี่คอร์ก็ตาม โดยหลักแล้วแต่ละเธรดมีหน่วยความจำแคชของตัวเองและตัวแปรอาจมีค่าที่แตกต่างกันในทั้งสองเธรด หากตัวแปรเป็น volatile
ค่าของตัวแปรนั้นจะได้รับการอัปเดตในทุกเธรดเสมอ
ฟิลด์อาจถูกประกาศว่ามีความผันผวน ซึ่งในกรณีนี้ Java Memory Model จะตรวจสอบให้แน่ใจว่าเธรดทั้งหมดเห็นค่าที่สอดคล้องกันสำหรับตัวแปร (§17.4)
ฉันขอแนะนำให้คุณอ่านเพิ่มเติมเกี่ยวกับ Java Memory Model
แม้แต่บน 1 คอร์ที่ใช้งานหลายเธรด คุณยังคงประสบปัญหา "การมองเห็น" นี้ได้ เนื่องจากเธรดที่โหลดค่าจากหน่วยความจำลงในรีจิสเตอร์จะบันทึกค่านี้ลงในสแต็กของเธรดนั้น และจะไม่เห็นการอัปเดตหาก เธรดถูกปิดแล้วเปิดใหม่อีกครั้ง เว้นแต่ มีการประกาศตัวแปร / หน่วยความจำ volatile