เมื่อนำแนวคิดเรื่องมัลติเธรดไปใช้งาน อาจเป็นไปได้ว่าการเปลี่ยนแปลงที่ทำโดยเธรดหนึ่งจะไม่ปรากฏแก่เธรดอื่น นี่แสดงว่ามุมมองของแต่ละเธรดไม่สอดคล้องกัน สิ่งนี้เรียกว่าข้อผิดพลาดความสอดคล้องของหน่วยความจำ
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'