Java双缓冲队列实现

前言

        在某一模块中,需要将网络接收到的数据存入Oracle中。这是一个典型的生产者消费者场景,可以使用消息队列隔离生产者和消费者。由于接收的数据频度很高,而Oracle的插入速度较慢,为不影响接收端吞吐量,选择了双缓冲队列作为消息队列。双缓冲队列的原理是一般情况下生产者使用写队列,消费者使用读队列,两个线程不需要做同步保护。当读队列消费完的时候,将读写队列交换,生成者使用空的读队列,消费者使用写队列。双缓冲队列只需在这时对读写队列进行同步保护即可,可大幅提高性能。

        在使用Java开始编码时发现,Java的多线程同步和C++的差距有点大,怎么会没有条件变量、信号量、互斥锁?百度了几个实例后基本了解了Java的同步策略,比C/C++的要简单不少。不管是条件变量还是互斥锁,synchronized这一个关键字全都搞定。Java每个对象都自带锁,synchronized(obj) { // codeblock } 即可在此代码段保护obj对象;使用obj.wait()、obj.notify()以及obj.nofifyAll()又可以起到条件变量的作用,实在是太方便了。

实现

         代码主要由一个双缓冲队列类、一个生产者类和一个消费者类组成。 需要说明的是,在我的这种实现里,只对写队列做了同步保护,这是因为在我的应用里读写队列交换由消费者控制,这样一来,读队列的使用以及交换全在消费者线程,读队列也就没必要同步了。如果改为定时交换的话,就必须对读队列也加保护了。

双缓冲队列类

         该类以单例模式实现,queue为单例对象。其中,
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值