Tôi đang cố gắng thiết kế một lớp như một Mã Kata cho bản thân mình có một thuộc tính giá trị có thể được đặt và lớp có thể phát hành các cá thể ValueListener. Ý tưởng là có một ví dụ của ValueHolder với nhiều chủ đề khách hàng truy cập đồng thời. Mỗi chuỗi khách hàng đã yêu cầu một ValueWatcher và đã gọi waitForValue().Thông báo cho chủ đề khi thay đổi bộ đếm
Điều tôi thực sự đấu tranh là điều kiện nào tôi nên sử dụng trên vòng lặp while xung quanh wait() để tránh các thông báo giả mạo (tức là giá trị không thay đổi). Tôi có thể thấy rằng thiết kế này có thể làm cho nó có thể của trường hợp ValueWatcher để bỏ lỡ bản cập nhật, nhưng ít lo lắng về điều đó ở giai đoạn này.
Sẽ đánh giá cao bất kỳ hướng dẫn nào về ưu đãi!
public class ValueHolder {
private int value = 0;
private final Object monitor = new Object();
public void setValue(int value) {
synchronized(monitor) {
this.value = value;
monitor.notifyAll();
}
}
ValueWatcher createChangeWatcher() {
return new ValueWatcher();
}
private class ValueWatcher {
public int waitForValue() {
synchronized(monitor) {
while (==== ??? =====) {
monitor.wait();
return value;
}
}
}
}
}
Bạn có thấy thông báo giả mạo không? Nếu chỉ updater gọi 'notification' hoặc' notifyall' thì tôi không thấy bạn sẽ như thế nào. – Gray
Có thể lệnh gọi 'setValue' chỉ nên thông báo cho người khác nếu' giá trị' thực sự đã thay đổi? Ngay bây giờ, nó có thể được cập nhật với cùng giá trị và mọi người được thông báo. Đó là điều bạn muốn? – Gray
Tôi không thấy lý do tại sao có một nhu cầu cho một vòng lặp 'while' ở tất cả. – biziclop