Với đoạn mã sau:Cài đặt an toàn cho chủ đề của biến (Java)?
public class FooBar {
public static volatile ConcurrentHashMap myConfigData = new ConcurrentHashMap();
}
public class UpdaterThread implements Runnable {
run {
//Query the Data from the DB and Update the FooBar config Data
FooBar.myConfigData = ConfigDataDAO.getLatestConfigFromDB();
}
}
Các Chủ đề-Class sẽ cập nhật myConfigData Membervariable thường xuyên (thông qua một Executor mỗi 5 phút). Là thiết lập của myConfigData trong luồng chủ đề "bên ngoài" (nguyên tử), hay tôi phải đồng bộ hóa mọi hoạt động Đọc và Ghi vào Biến myConfigData?
EDIT: Câu hỏi đặt ra là liệu ConcurrentHashMap có phải là chủ đề an toàn không (theo javadoc) mà đúng hơn là cài đặt Bản ConcurrentHashMap trong biến Thành viên myConfigData. Biến này có thể được đọc và viết "cùng một lúc" bởi một số luồng nên câu hỏi là liệu cài đặt có phải là nguyên tử hay không. Tôi nghĩ rằng điều này có thể được khái quát hóa là "Thiết lập của một biến tham chiếu Java có nguyên tử hay không?".
(Tôi cũng đã làm cho nó dễ bay hơi này là một vấn đề khác nhau và không có gì để làm với số nguyên tử - câu hỏi của tôi - mà là "tầm nhìn trong chủ đề khác" và mối quan hệ xảy ra-trước..)
@unknown: văn bản được trích dẫn không nói những gì bạn nghĩ nó nói !! Trong thực tế, viên đạn tiếp theo trong JLS nói điều này: "Trong trường hợp không đồng bộ hóa rõ ràng, việc thực hiện là miễn phí để cập nhật bộ nhớ chính theo thứ tự có thể gây ngạc nhiên. Do đó, lập trình viên muốn tránh những điều bất ngờ nên sử dụng đồng bộ hóa rõ ràng. " –
@unknown: lý do duy nhất mà mã của OP là an toàn là anh ta đã khai báo biến là 'volatile'. –
@Stephen Tôi nghĩ điểm chính của câu hỏi là về nguyên tử của nhiệm vụ. Đó là lý do tại sao tôi trích dẫn phần này của spec. Nếu tôi hiểu chính xác, thì nguyên tử này được đảm bảo ngay cả khi không dễ bay hơi. Tuy nhiên, điều đó có thể xảy ra, các chủ đề khác sẽ không bao giờ thấy cập nhật cho biến và tiếp tục thấy tham chiếu "cũ". Tuy nhiên một chuỗi sẽ không bao giờ thấy "một tham chiếu đến một số đối tượng khác hoặc một giá trị tham chiếu bị hỏng". – Wolfgang