Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ข้อผิดพลาดความสอดคล้องของหน่วยความจำใน Java


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

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'