,本节以ArrayBlockingQueue为例, 带大家看下阻塞队列是如何实现,一起来看下吧!,同样的,我们先从它的构造函数看起。,上节我们使用的就是它的默认用法,公平锁和非公平锁我们之前讲过,可以查看以往文章(ReentrantLock源码分析)。下面我们接着看:,从上面的代码来看,可知capacity > 0,第一个构造函数的this()其实就是调的这个构造函数,我们可以通过它来指定容量和访问策略(fair 和 nofair)的ArrayBlockingQueue。,再接着看最后一个构造函数。,从代码来看,对比上一个多了个Collection,这是干嘛的呢?它允许我们在创建的时候初始化一个集合进去,按迭代顺序添加到容器,从它的内部我们也可以看出来。,我们看下add方法,这个方法用于向队列中添加元素。,内部调用了父类的方法,它继承了AbstractQueue。,接着看AbstractQueue的add()。,可以看到内部调用了offer(), 如果添加成功就返回true,失败就抛出异常, 这符合我们上节使用时它的特点。,但是,我们发现在它的内部并没有offer方法,所以实现不在AbstractQueue,实现还是在ArrayBlockingQueue。,来看下ArrayBlockingQueue的offer()方法。,看下enqueue:,先看第一个 remove(), 同样的这个方法存在于 AbstractQueue内部,如果被移除的元素为null则抛出异常。,poll()的实现在ArrayBlockingQueue,内部实现方式跟add很像。,第二个remove(e), 这个实现在ArrayBlockingQueue的内部,可以移除指定元素。,take会造成线程阻塞下面我看下它的内部实现。,该方法实现跟 take类似, 也会阻塞线程。,本节主要给大家讲了ArrayBlockingQueue的源码实现,它的源码相对简单一些, 大家可以根据本节看下BlockingQueue其它的实现类。
© 版权声明
文章版权归作者所有,未经允许请勿转载。