ArrayBlockingQueue源码阅读心得

      最近在看林昊写的那本《分布式java应用》,阿里巴巴(包括淘宝、支付宝)是我最想去的地方,所以看淘宝网架构师写的书还是很有必要的。

      该书第4章讲到了java.util.concurrent下面的一些常用类,由于书上写的太过笼统,所以找出一些类的源码进行阅读,现把心得写一下,供以后自己参考。

      废话不说,先看ArrayBlockingQueue的源码。

      ArrayBlockingQueue是一个基于数组的、先进先出、线程安全的集合类,其特色为可实现指定时间的阻塞读写,并且容量是可以限制的。

      通过阅读代码,可以看出该类是通过ReentrantLock来保证线程安全的,顺便讲一下ReentrantLock。

      ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。在该类的实现中,采用的是不公平锁。

 

public ArrayBlockingQueue(int capacity) {
        this(capacity, false);
    }

 

      该类没有默认构造函数,从上面的构造函数中可以看出默认情况下采用不公平锁。

      offer方法有两种实现,分为阻塞的和非阻塞的。offer(E e)如果在数组满的情况下直接返回false。offer(E e, long timeout, TimeUnit unit)为阻塞方式,则阻塞unit.toNanos(timeout)纳秒。

      poll() 方法也分两种,和上面的差不多。

      

public Iterator<E> iterator() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            return new Itr();
        } finally {
            lock.unlock();
        }
    }
  

        可以看出在调用iterator()方法时,首先进行加锁,并返回一个Itr的实例。

        

Itr() {
            lastRet = -1;
            if (count == 0)
                nextIndex = -1;
            else {
                nextIndex = takeIndex;
                nextItem = items[takeIndex];
            }
        }
 

         该Itr实例包含了当前数组尾部的索引以及尾部的元素,调用完毕后释放锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值