Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Lỗi nhất quán bộ nhớ (Memory Consistency Error) trong Java


Khi triển khai đa luồng, có thể thay đổi của một luồng không hiển thị cho luồng khác. Điều này cho thấy quan điểm của từng luồng không nhất quán với nhau. Đây gọi là lỗi nhất quán bộ nhớ.

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

Thường xảy ra khi thực hiện ghi (write operation), từ đó tránh thời gian chờ CPU.

Ghi là hoạt động nguyên tử (atomic), nghĩa là không hoạt động nào khác được thực hiện bởi các luồng khác khi ghi đang diễn ra.

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

Làm thế nào tránh lỗi không nhất quán bộ nhớ?

Cần thiết lập mối quan hệ happens-before để ghi bộ nhớ bởi một luồng đơn lẻ, và điều này hiển thị cho các hoạt động đọc của luồng khác trên cùng bộ nhớ.

Hàm start và join được coi là mối quan hệ happens-before. start đảm bảo luồng mới được tạo hiển thị. join đảm bảo luồng hiển thị được nối với luồng 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();    } }

Kết quả

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

Lớp class_shared định nghĩa giá trị static và hàm void lặp qua tập số, tăng và in ra. Hàm dec lặp và giảm. Lớp Demo chứa main tạo thể hiện lớp, tạo luồng mới, ghi đè và gọi run. Cùng làm cho luồng thứ hai. Cả hai luồng được gọi bằng start.