简短结论:Java 中“观察者模式”本身不是语言层面的机制,是否同步取决于你的实现方式;但使用 Java 标准库 java.util.Observable / Observer(已废弃)时是同步的。
下面分情况说明:
观察者模式只是一种设计思想:
是否同步,由你怎么写决定
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void notifyObservers() {
for (Observer o : observers) {
o.update(); // 当前线程依次执行
}
}
}
✅ 特点:
notify 的线程会一个一个执行观察者public void notifyObserversAsync() {
for (Observer o : observers) {
new Thread(o::update).start();
}
}
或用线程池 / CompletableFuture
✅ 特点:
class MyObservable extends Observable {
public void change() {
setChanged();
notifyObservers();
}
}
✅ 是同步的
notifyObservers() 会在调用线程中依次调用 update()⚠️ 注意:
Observable / Observer 在 Java 9 已废弃PropertyChangeListener 或自己实现@EventListener
public void handle(Event e) {}
默认:
可异步:
@Async
@EventListener
public void handle(Event e) {}
(需开启 @EnableAsync)
| 场景 | 是否同步 |
|---|---|
| 自己实现的观察者 | 看你代码 |
java.util.Observer |
✅ 同步 |
Spring @EventListener |
✅ 默认同步,可异步 |
| 消息队列 / EventBus | ❌ 通常异步 |
如果你是为了线程安全、性能或解耦在考虑同步问题,可以告诉我具体使用场景,我可以帮你选最合适的实现方式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。