Computer >> Máy Tính >  >> Lập trình >> Java

Lỗi nhất quán bộ nhớ trong Java

Khi khái niệm đa luồng được triển khai, có thể những thay đổi được thực hiện bởi một luồng sẽ không hiển thị với luồng kia. Điều này chỉ ra rằng chế độ xem của mỗi luồng không nhất quán với nhau. Đây được gọi là lỗi nhất quán bộ nhớ.

CPU có thể bắt đầu truy cập bộ nhớ chính theo một thứ tự khác, trong khi các luồng có thể truy cập chúng theo một thứ tự khác.

Điều này thường đúng khi thao tác ghi đang được thực hiện, do đó tránh được thời gian chờ của CPU.

Thao tác ghi là một thao tác nguyên tử, có nghĩa là không có thao tác nào khác sẽ được thực hiện bởi các luồng khác khi một thao tác ghi đang được thực hiện.

Ngoài ra, thứ tự thực hiện thao tác ghi sẽ được duy trì nhất quán cho mọi CPU liên quan, trong khi các CPU này có thể hiểu thời gian ghi của các CPU khác theo một cách khác. Hiện tượng này có thể dẫn đến sự không nhất quán của bộ nhớ.

Làm cách nào để tránh được lỗi không nhất quán bộ nhớ?

Một mối quan hệ xảy ra trước cần được thiết lập để việc ghi vào bộ nhớ được thực hiện bởi chuỗi asingle và điều này có thể nhìn thấy để đọc các hoạt động được thực hiện bởi chuỗi khác trên cùng một bộ nhớ.

Hàm "start" và hàm "join" được coi là mối quan hệ xảy ra trước khi xảy ra. Hàm ‘start’ đảm bảo rằng luồng mới được tạo có thể nhìn thấy được. Hàm 'tham gia' đảm bảo rằng chuỗi hiển thị được liên kết với chuỗi khác.

Ví dụ

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();
   }
}

Đầu ra

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

Một lớp có tên ‘class_shared’ xác định một giá trị tĩnh và một hàm void, lặp lại trên một tập hợp các số và tăng dần nó lên và hiển thị trên bảng điều khiển. Một hàm khác có tên là ‘dec’ lặp lại một tập hợp các số và số giảm mỗi lần và hiển thị kết quả đầu ra trên bảng điều khiển. Một Demo có tên lớp chứa hàm chính tạo một thể hiện của lớp và tạo một luồng mới. Luồng này bị ghi đè và hàm run được gọi trên cá thể đối tượng này. Điều tương tự cũng được thực hiện cho chủ đề thứ hai. Sau đó, cả hai luồng này được gọi bằng hàm "start".