JSR-133 FAQ nói:hiệu ứng nhớ đồng bộ hóa trong Java
Nhưng có nhiều hơn để đồng bộ hóa hơn loại trừ lẫn nhau. Đồng bộ hóa đảm bảo rằng bộ nhớ ghi theo luồng trước hoặc trong khối đồng bộ được hiển thị theo cách có thể dự đoán đối với các chủ đề khác mà đồng bộ trên cùng một màn hình. Sau chúng tôi thoát khỏi khối đồng bộ, chúng tôi phát hành màn hình, có hiệu ứng khi xả bộ nhớ cache tới bộ nhớ chính , do đó chủ đề này có thể hiển thị với các chủ đề khác. Trước khi chúng tôi có thể nhập một khối đồng bộ , chúng tôi có được màn hình , có hiệu lực làm mất hiệu lực bộ nhớ cache của bộ xử lý cục bộ sao cho các biến sẽ được tải lại từ bộ nhớ chính. Sau đó, chúng tôi sẽ có thể để xem tất cả các bài viết được hiển thị bằng bản phát hành trước đó.
Tôi cũng nhớ rằng trên máy ảo Sun hiện đại, đồng bộ hóa không được giám sát là rẻ. Tôi hơi bối rối trước tuyên bố này. Hãy xem xét mã như:
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
Cập nhật cho x cần đồng bộ hóa, nhưng việc mua lại khóa có xóa giá trị của y cũng khỏi bộ nhớ cache không? Tôi không thể tưởng tượng được như vậy, bởi vì nếu nó là sự thật, thì các kỹ thuật như việc khóa dải có thể không giúp được gì. Ngoài ra, JVM có thể phân tích mã một cách đáng tin cậy để đảm bảo rằng y không được sửa đổi trong một khối đồng bộ khác bằng cách sử dụng cùng một khóa và do đó không kết xuất giá trị của y trong bộ đệm khi nhập khối được đồng bộ?
Gần đây tôi đã xem qua bài viết [CPU Cache Flushing Fallacy] (http://mechanical-sympathy.blogspot.com/2013/02/cpu-cache-flushing-fallacy.html), đó là hữu ích trong việc hiểu điều này tốt hơn. –