Giả sử bạn có mã này:Trong khối Java được đồng bộ hóa, có thể hiển thị trên tất cả các trường hoặc chỉ biến được đồng bộ hóa?
private String cachedToken;
private final Object lockObject = new Object();
....
retrieveToken(){
synchronized(lockObject){
if (cachedToken == null){
cachedToken = goGetNewToken();
}
return cachedToken;
}
}
Liệu ghi vào cachedToken
được hiển thị cho tất cả các chủ đề đã bị khóa trên lockObject
?
Vâng, đó là vấn đề ... Nhưng việc ghi có thể xảy ra với bộ nhớ cache l1 hoặc l2 của CPU và không được chuyển sang bộ nhớ chính trước khi một chuỗi khác lấy khóa. –
Điều đó không đúng. Nếu một luồng khác khóa trên 'lockObject' sau khi một luồng khác viết thì lá, chuỗi nhập sẽ thấy ghi. –
Lưu ý: ghi vào "biến đồng bộ" thường xuyên * xấu *. Mã được đồng bộ hóa trên một đối tượng, không phải là một biến. Nếu biến được thay đổi giữa dòng để tham chiếu một đối tượng khác, nhiều khối được đồng bộ hóa trên đối tượng được tham chiếu bởi biến đó có thể thực thi đồng thời. –