温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java观察者模式是同步的吗

发布时间:2026-09-13 05:17:42 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

简短结论:Java 中“观察者模式”本身不是语言层面的机制,是否同步取决于你的实现方式;但使用 Java 标准库 java.util.Observable / Observer(已废弃)时是同步的。

下面分情况说明:


1️⃣ 观察者模式本身 ≠ 一定同步

观察者模式只是一种设计思想:

  • 被观察者(Subject)维护观察者列表
  • 状态变化时通知观察者

是否同步,由你怎么写决定

同步实现(最常见)

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

✅ 特点:

  • 通知不阻塞
  • 需要自己处理线程安全

2️⃣ Java 标准库中的观察者(已废弃)

class MyObservable extends Observable {
    public void change() {
        setChanged();
        notifyObservers();
    }
}

✅ 是同步的

  • notifyObservers() 会在调用线程中依次调用 update()
  • 没有异步机制

⚠️ 注意:

  • Observable / Observer 在 Java 9 已废弃
  • 官方建议用 PropertyChangeListener 或自己实现

3️⃣ Spring 中的观察者(ApplicationEvent)

@EventListener
public void handle(Event e) {}

默认:

  • ✅ 同步
  • 在同一个线程中执行

可异步:

@Async
@EventListener
public void handle(Event e) {}

(需开启 @EnableAsync)


4️⃣ 总结一句话

场景 是否同步
自己实现的观察者 看你代码
java.util.Observer ✅ 同步
Spring @EventListener ✅ 默认同步,可异步
消息队列 / EventBus ❌ 通常异步

如果你是为了线程安全、性能或解耦在考虑同步问题,可以告诉我具体使用场景,我可以帮你选最合适的实现方式。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手