"Chào, Amigo!"

"Có một chủ đề lớn ngoài kia—Mô hình bộ nhớ Java. Về cơ bản, bạn chưa cần phải biết về nó, nhưng sẽ rất hữu ích nếu biết về nó."

"Để loại bỏ tất cả các sự cố tiềm ẩn, Java đã thay đổi cơ chế quản lý bộ nhớ của nó. Giờ đây, bộ nhớ không chỉ đơn giản được chia thành bộ nhớ đệm cục bộ và bộ nhớ chung của luồng—cơ chế này thậm chí còn tốt hơn."

"Và phức tạp hơn!"

"Đúng vậy, tốt hơn phức tạp hơn. Nó giống như máy bay. Bay bằng máy bay tốt hơn đi bộ, nhưng phức tạp hơn. Tôi sẽ cố gắng giải thích tình huống mới một cách đơn giản nhất."

"Đây là những gì họ đã nghĩ ra. Một cơ chế đồng bộ hóa bộ nhớ luồng cục bộ, được gọi là 'xảy ra trước', đã được thêm vào mã. Một số quy tắc/điều kiện đã được phát minh. Khi các điều kiện này được thỏa mãn, bộ nhớ sẽ được đồng bộ hóa hoặc cập nhật về hiện tại tình trạng.

"Đây là một ví dụ:"

Đặt hàng chủ đề 1 chủ đề 2
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
Chuỗi đang chờ mutex được giải phóng

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"Một trong những điều kiện này là việc mua lại mutex đã giải phóng. Nếu một mutex được giải phóng và mua lại, thì bộ nhớ sẽ được đồng bộ hóa trước khi mua lại. Chủ đề 2 sẽ thấy các giá trị 'mới nhất' của các biến x và y, ngay cả khi bạn không tuyên bố chúng dễ bay hơi."

"Thật thú vị! Và những điều kiện này có nhiều không?"

"Đủ rồi—đây là một số điều kiện để đồng bộ hóa bộ nhớ:"

  • "Trong một luồng đơn lẻ, bất kỳ lệnh nào cũng xảy ra - trước bất kỳ thao tác nào theo sau nó trong mã nguồn."
  • "Việc giải phóng một khóa xảy ra - trước khi có được cùng một khóa."
  • "Một lối thoát khỏi khối/phương thức  được đồng bộ hóa xảy ra - trước khi khối/phương thức được đồng bộ hóa được nhập trên cùng một màn hình."
  • "Việc ghi một trường dễ bay hơi vào bộ nhớ xảy ra - trước khi cùng một trường dễ bay hơi được đọc từ bộ nhớ."
  • "Việc kết thúc phương thức chạy của đối tượng Chủ đề xảy ra-trước khi phương thức nối() kết thúc hoặc phương thức isAlive() trả về giá trị sai trên đối tượng trong cùng một luồng."
  • "Một cuộc gọi đến phương thức start() của đối tượng Thread xảy ra-trước khi phương thức run() bắt đầu trên đối tượng trong cùng một luồng."
  • "Sự kết thúc của hàm tạo xảy ra - trước khi bắt đầu phương thức finalize() của lớp này."
  • "Một cuộc gọi đến phương thức ngắt () xảy ra - trước khi luồng xác định rằng phương thức này đã được gọi, do một Ngoại lệ gián đoạn được đưa ra hoặc bằng cách sử dụng các phương thức isInterrupted () hoặc bị gián đoạn ().

"Vậy, mọi chuyện phức tạp hơn tôi tưởng một chút sao?"

“Ừ, phức tạp hơn một chút…”

"Cảm ơn, Rishi. Tôi sẽ suy nghĩ về nó."

"Đừng lo lắng về chủ đề này quá nhiều. Sẽ đến lúc bạn tự hiểu tất cả. Hiện tại, tốt hơn hết là bạn nên hiểu những điều cơ bản, hơn là đi sâu vào khu rừng rậm vốn là hoạt động bên trong của máy Java. Java 9 sẽ được phát hành và sau đó mọi thứ sẽ lại thay đổi."

"O_o. Ừ... Có một số điều không biết thì tốt hơn."