J*a里如何实现线程安全的事件发布与订阅_事件发布订阅线程安全操作说明


使用CopyOnWriteArrayList可实现线程安全的事件发布订阅,适合读多写少场景;通过读写锁+列表快照可提升高并发性能,结合线程池支持异步分发,确保事件处理不阻塞发布线程,根据场景选择方案。

java里如何实现线程安全的事件发布与订阅_事件发布订阅线程安全操作说明

在J*a中实现线程安全的事件发布与订阅,关键在于确保多个线程同时注册、注销或触发事件时不会引发并发问题。常见的做法是使用线程安全的数据结构来管理监听器列表,并保证事件发布过程中的读写一致性。

使用CopyOnWriteArrayList管理监听器

最简单且高效的线程安全方式是使用CopyOnWriteArrayList存储订阅者(监听器)。该集合在修改时会复制底层数组,适合读多写少的场景,如事件广播。

示例代码:

import j*a.util.concurrent.CopyOnWriteArrayList;

public class EventBus {
    private final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>();

    public void subscribe(EventListener listener) {
        listeners.add(listener);
    }

    public void unsubscribe(EventListener listener) {
        listeners.remove(listener);
    }

    public void publish(Event event) {
        for (EventListener listener : listeners) {
            listener.onEvent(event);
        }
    }
}

interface EventListener {
    void onEvent(Event event);
}

class Event {
    private final String data;

    public Event(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }
}

说明:CopyOnWriteArrayList在遍历过程中允许添加/删除操作,不会抛出ConcurrentModificationException,非常适合事件通知这种频繁读取、较少变更的场景。

使用显式同步控制(适用于复杂逻辑)

如果需要更细粒度的控制,比如支持按类型订阅、异步分发等,可以使用synchronizedReentrantReadWriteLock保护监听器集合。

示例:使用读写锁提升性能

Claude Claude

Anthropic发布的与ChatGPT竞争的聊天机器人

Claude 1166 查看详情 Claude
import j*a.util.ArrayList;
import j*a.util.List;
import j*a.util.concurrent.locks.ReadWriteLock;
import j*a.util.concurrent.locks.ReentrantReadWriteLock;

public class ThreadSafeEventBus {
    private final List<EventListener> listeners = new ArrayList<>();
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    public void subscribe(EventListener listener) {
        lock.writeLock().lock();
        try {
            listeners.add(listener);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public void unsubscribe(EventListener listener) {
        lock.writeLock().lock();
        try {
            listeners.remove(listener);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public void publish(Event event) {
        lock.readLock().lock();
        try {
            // 创建快照避免持有锁期间调用回调
            List<EventListener> safeListeners = new ArrayList<>(listeners);
            for (EventListener listener : safeListeners) {
                listener.onEvent(event);
            }
        } finally {
            lock.readLock().unlock();
        }
    }
}

优势:读操作不阻塞,适合高频率事件发布;通过拷贝监听器列表,避免在锁内执行可能耗时的回调方法。

异步事件分发与线程池集成

若事件处理较耗时,建议将事件分发交给线程池,避免阻塞发布线程。

改进publish方法:

private final ExecutorService executor = Executors.newFixedThreadPool(4);

public void publish(Event event) {
    lock.readLock().lock();
    List<EventListener> safeListeners;
    try {
        safeListeners = new ArrayList<>(listeners);
    } finally {
        lock.readLock().unlock();
    }

    for (EventListener listener : safeListeners) {
        executor.submit(() -> listener.onEvent(event));
    }
}

注意:异步模式下事件顺序不保证,需根据业务决定是否使用单线程线程池(如newSingleThreadExecutor)来保序。

基本上就这些。选择哪种方式取决于你的使用场景:轻量级用CopyOnWriteArrayList,功能复杂可配合读写锁和线程池,关键是保证监听器列表的线程安全和事件发布的稳定性。

以上就是J*a里如何实现线程安全的事件发布与订阅_事件发布订阅线程安全操作说明的详细内容,更多请关注其它相关文章!


# 适用于  # 论坛怎么做seo排名  # 广东景物网站建设  # seo黑帽招聘技巧  # 西安网站推广威心hfqjwl做词  # 宁波集团公司网站建设  # 网站中关键词优化  # 企业网站优化哪家便宜  # 武清区营销推广方法  # 巩义网站优化哪家售后好  # 营销推广4p4c  # 相关文章  # java  # 遍历  # 多个  # 多写  # 过程中  # 配置文件  # 回调  # 如何实现  # 数据结构  # 有锁  # 线程安全 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享  繁花漫画使用教程  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  51漫画网实时入口 51漫画网页版官方免费漫画入口  如何在CSS中使用伪类选择器_hover实现悬停效果  pubmed数据库官方主页_pubmed学术论文查找官网直达  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  《随手记》备份数据方法  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  React应用中Commerce.js数据加载与状态管理最佳实践  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  《星露谷物语》克林特好感度事件介绍  如何高效地基于键列值映射DataFrame中的多个列  C#解析来自网络的XML流数据 实时错误处理与重试机制  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  byrutor直接访问入口 byrutor官方游戏库  德邦物流在线查询系统 德邦快递货物运输追踪  sf漫画官网登录入口直达_sf漫画官方正版网址  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  Google Drive API 认证:服务账户与OAuth 2.0的选择与实践  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  Composer如何使用composer-plugin-api开发自定义插件  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  J*a实现任务清单管理_集合框架综合入门练手  《梦想世界:长风问剑录》药师一图流分享  Teambition网盘如何共享文件  《异星探险家》古怪的物品作用介绍  C++ static关键字作用_C++静态成员变量与静态函数  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  《东方航空》添加乘机人方法  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  鼠标没反应了怎么办 无线/有线鼠标失灵的解决方法【详解】  在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  TikTok网页版入口快速访问 TikTok官网账号登录方法  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  抖音团长模式怎么做?团长模式是什么意思?  基于键值条件高效映射 Pandas DataFrame 多列数据  yandex网页版直接登录 yandex官方入口平台访问方法  uc浏览器官网网页版使用 uc浏览器官网免费在线首页  Flexbox布局:实现粘性导航与底部页脚的完美结合  优酷官网登录入口电脑版 优酷官网网址入口  免费占卜在线神算_免费占卜手机神算  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  汽水音乐车机版 汽水音乐车机版官方入口  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  b站网页版入口 哔哩哔哩官方网站直接进入  网页版网易云音乐入口_网易云音乐在线官网登录 

 2025-12-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.