Tôi có một máy chủ nào như thế này:An toàn chủ đề nhưng nhanh chóng truy cập vào biến "cuối cùng cuối cùng"?
class Server {
private WorkingThing worker;
public void init() {
runInNewThread({
// this will take about a minute
worker = new WorkingThing();
});
}
public Response handleRequest(Request req) {
if (worker == null) throw new IllegalStateException("Not inited yet");
return worker.work(req);
}
}
Như bạn có thể thấy, có đề xử lý các yêu cầu và một sợi initing máy chủ. Yêu cầu có thể đến trước khi kết thúc, do đó có séc với IllegalStateException
.
Bây giờ, để làm cho chủ đề này an toàn (vì vậy yêu cầu bộ xử lý không nhìn thấy cũ, null
-valued, phiên bản worker
ngay sau init), tôi phải làm cho công nhân dễ bay hơi, đồng bộ hóa trên đó hoặc một số như là.
Tuy nhiên, sau khi quá trình init hoàn tất, worker
sẽ không bao giờ thay đổi nữa, do đó, nó sẽ hiệu quả cuối cùng. Do đó, nó có vẻ như bất kỳ tranh chấp khóa có thể xảy ra sẽ là một sự lãng phí. Vậy, điều hiệu quả nhất tôi có thể làm ở đây là gì?
Bây giờ tôi biết nó không thực sự quan trọng trong một ý nghĩa thực tế (với tất cả các nâng nặng của đọc một yêu cầu mạng, vv, một vấn đề khóa duy nhất là gì?), Nhưng tôi muốn biết sự tò mò .
sử dụng từ khóa 'đồng bộ hóa 'chi phí rất nhiều chu kỳ. Tôi nghĩ cách tốt nhất là biến 'worker' thành' static'. Bằng cách này nó sẽ phân bổ một không gian dành riêng trong bộ nhớ, và tôi nghĩ rằng các chủ đề sẽ luôn luôn nhìn vào không gian đó. Chỉ là một ý nghĩ, có thể không chính xác. –
Việc gọi trình chủ 'worker.work (req)' có an toàn không? Tôi chỉ yêu cầu đảm bảo rằng bạn chỉ yêu cầu chặn các chuỗi gọi cho đến khi 'worker' được khởi tạo. Đúng không? –
@ViktorSeifert Có, một khi 'nhân viên' ở đó, nó an toàn. –