开发者社区> 问答> 正文

关于EventTransactionBuffer的疑问

看代码发现,在stop()的过程中,entries会被置为null,但是如果put()也同时在进行,不会导致npe么...?

原提问者GitHub用户fjysmall

展开
收起
云上静思 2023-05-04 12:13:26 60 0
2 条回答
写回答
取消 提交回答
  • stop应该是先停止写入线程,最后再清空状态

    原回答者GitHub用户agapple

    2023-05-05 10:27:10
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    关于 Canal 中的 EventTransactionBuffer,该类是用于缓存 binlog 事件的,可以保证在同一事务中的事件,都被缓存到同一个 buffer 中,以保证事务的完整性。在 stop() 方法中,为了防止在 buffer 被清空时,还有其他线程在向 buffer 中写入事件,会将 entries 置为空,以防止其他线程继续写入。这个操作是为了保证 buffer 的数据一致性和完整性,避免后续的操作出现错误。

    在 put() 方法中,如果在 entries 为 null 的情况下,还有其他线程在调用 put() 方法,会导致 NPE(NullPointerException)异常。为了避免这种情况的发生,可以使用 synchronized 关键字,对 put() 方法进行同步,以保证 put() 方法的原子性和线程安全性。例如:

    private synchronized void put(List entries) { if (this.entries == null) { throw new IllegalStateException("EventTransactionBuffer has stopped"); } this.entries.addAll(entries); if (logger.isDebugEnabled()) { logger.debug(entries.size() + " entries has been added into buffer, current size " + this.entries.size()); } } 需要注意的是,在使用 synchronized 关键字时,需要考虑到性能和死锁等问题,以确保代码的正确性和可靠性。

    2023-05-04 18:02:33
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载