เมื่อนำแนวคิดเรื่องมัลติเธรดไปใช้งาน อาจเป็นไปได้ว่าการเปลี่ยนแปลงที่ทำโดยเธรดหนึ่งจะไม่ปรากฏแก่เธรดอื่น นี่แสดงว่ามุมมองของแต่ละเธรดไม่สอดคล้องกัน สิ่งนี้เรียกว่าข้อผิดพลาดความสอดคล้องของหน่วยความจำ
CPU อาจเริ่มการเข้าถึงหน่วยความจำหลักในลำดับที่ต่างกัน ในขณะที่เธรดอาจเข้าถึงตามลำดับที่แตกต่างกัน
ซึ่งมักจะเป็นจริงเมื่อดำเนินการเขียน ดังนั้นจึงหลีกเลี่ยงเวลารอ CPU
การดำเนินการเขียนเป็นแบบอะตอมมิก หมายความว่าจะไม่มีการดำเนินการอื่นโดยเธรดอื่นเมื่อมีการดำเนินการเขียน
นอกจากนี้ ลำดับการดำเนินการเขียนจะได้รับการดูแลอย่างสม่ำเสมอสำหรับ CPU ที่เกี่ยวข้องทุกตัว ในขณะที่ CPU สามารถเข้าใจเวลาเขียนของ CPU อื่นๆ ในลักษณะที่แตกต่างกัน ปรากฏการณ์นี้อาจนำไปสู่ความไม่สอดคล้องกันของหน่วยความจำ
จะหลีกเลี่ยงข้อผิดพลาดของหน่วยความจำที่ไม่สอดคล้องกันได้อย่างไร
จำเป็นต้องสร้างความสัมพันธ์ที่เกิดขึ้นก่อนเพื่อให้การเขียนหน่วยความจำดำเนินการโดยเธรดเดี่ยว และการดำเนินการนี้สามารถมองเห็นได้สำหรับการดำเนินการอ่านที่ทำโดยเธรดอื่นในหน่วยความจำเดียวกัน
ฟังก์ชัน 'start' และ 'join' ถือเป็นความสัมพันธ์ที่เกิดขึ้นก่อน ฟังก์ชัน 'เริ่ม' ทำให้แน่ใจว่าเธรดที่สร้างขึ้นใหม่สามารถมองเห็นได้ ฟังก์ชัน 'เข้าร่วม' ทำให้แน่ใจว่าเธรดที่มองเห็นได้เชื่อมต่อกับเธรดอื่น
ตัวอย่าง
import java.io.*; class class_shared{ static int m=2; void inc(){ for(int j=0;j<5;j++){ m = m+1; System.out.println("After its increment is "+m); } } void dec(){ for(int j=0;j<5;j++){ m = m-1; System.out.println("After its decrement is "+m); } } } public class Demo{ public static void main(String[] args){ final class_shared my_inst = new class_shared(); Thread my_t_1 = new Thread(){ @Override public void run(){ my_inst.inc(); } }; Thread my_t_2 = new Thread(){ @Override public void run(){ my_inst.dec(); } }; my_t_1.start(); my_t_2.start(); } }
ผลลัพธ์
After its increment is 3 After its decrement is 2 After its decrement is 2 After its decrement is 1 After its increment is 3 After its decrement is 0 After its increment is 1 After its increment is 1 After its decrement is 0 After its increment is 2
คลาสชื่อ 'class_shared' กำหนดค่าคงที่และฟังก์ชัน void ที่วนซ้ำชุดตัวเลข และเพิ่มค่าและแสดงบนคอนโซล ฟังก์ชันอื่นที่ชื่อว่า 'dec' ทำซ้ำชุดตัวเลขและลดลงทุกครั้งและแสดงเอาต์พุตบนคอนโซล การสาธิตชื่อคลาสประกอบด้วยฟังก์ชันหลักที่สร้างอินสแตนซ์ของคลาส และสร้างเธรดใหม่ เธรดนี้ถูกแทนที่ และมีการเรียกใช้ฟังก์ชันการทำงานบนอินสแตนซ์อ็อบเจ็กต์นี้ ทำสิ่งเดียวกันสำหรับเธรดที่สองด้วย เธรดทั้งสองนี้จะถูกเรียกด้วยฟังก์ชัน 'start'