Tôi đang gặp khó khăn với quyết định. Tôi đang viết một thư viện/API an toàn. Người nghe có thể được đăng ký, vì vậy khách hàng được thông báo khi có điều gì đó thú vị xảy ra. Triển khai nào trong hai triển khai phổ biến nhất?thông báo cho người nghe bên trong hoặc bên ngoài đồng bộ hóa bên trong
class MyModule {
protected Listener listener;
protected void somethingHappens() {
synchronized(this) {
... do useful stuff ...
listener.notify();
}
}
}
hoặc
class MyModule {
protected Listener listener;
protected void somethingHappens() {
Listener l = null;
synchronized(this) {
... do useful stuff ...
l = listener;
}
l.notify();
}
}
Trong việc thực hiện đầu tiên, người nghe được thông báo bên trong đồng bộ hóa. Trong lần thực hiện thứ hai, điều này được thực hiện bên ngoài đồng bộ hóa.
Tôi cảm thấy rằng điều thứ hai được thông báo, vì nó làm cho ít chỗ hơn cho deadlocks tiềm năng. Nhưng tôi đang gặp rắc rối để thuyết phục bản thân mình.
Nhược điểm của lần thứ hai là khách hàng có thể nhận được thông báo 'không chính xác', điều này xảy ra nếu nó truy cập và thay đổi mô-đun trước câu lệnh l.notify(). Ví dụ, nếu nó yêu cầu các mô-đun để ngừng gửi thông báo, notificaiton này được gửi đi anyway. Đây không phải là trường hợp trong lần thực hiện đầu tiên.
thanks a lot
Cảm ơn câu trả lời của bạn. Tôi cố ý chấm không đề cập đến phần đăng ký/hủy đăng ký. Tôi muốn giả sử có một người nghe cố định. Câu hỏi của tôi là khá khôn ngoan nếu phơi bày sự đồng bộ hóa bên ngoài lớp học hay không. –
@Jary Zeels, xem phần bổ sung để trả lời –
Cảm ơn Adrian đã làm rõ, tôi hiểu ngay bây giờ. Tình huống với một người nghe rõ ràng với tôi. Tôi sẽ suy nghĩ về tình huống khi nhiều người nghe có thể được đăng ký, bởi vì sau đó, tái entrancycan là một vấn đề. Bạn không muốn các sự kiện được phân phối theo thứ tự sai khi ví dụ một trong những người nghe được thông báo thực hiện điều gì đó kích hoạt một thông báo mới. Tôi sẽ suy nghĩ về nó và quay trở lại với nhiều câu hỏi hơn nếu cần thiết. Cảm ơn một lần nữa. –