大家好,最近由于公司的事情不是很多,准备开篇写一写concurrent这一块,因为最近好多面试者对这个都不是很了解,有的是知其然不知其所以然,我写这篇(系列)文章的初衷是为了总结和归纳这一块,如果本文能够对大家带来一定的帮助,那么一定是我莫大的荣耀,好了,话不多说我们开始探秘concurrent吧。
首先从字面意思我们能理解到concurrent是“同时发生的”,在java中自然是用来做并发使用的,这个concurrent 包是java5才提出的,然而经过几个版本的更迭,目前已经是大家都会深入用到,或者是多少会接触到的,其实在java中已经有 Thread
, Runnable
等多线程的实现;我们为什么要用到concurrent包来做呢?下面我将带大家一步一步的了解。
针对高质量Java多线程并发程序设计时,为防死崩等现象的出现,比如使用java之前的 wait()
、 notify()
和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担。为了减少甚至是去除咱们这种后顾之忧, Doug Lea为大家推出了这个解决方案,让众多java开发者如沐春风。
在java8中concurrent一共有21个接口、38个类其中包括抽象类和内部类、1个枚举类、6种异常方式,当然这个数字都不重要,大家在看api的时候只会找自己关注的部分。
BlockingDeque继承自BlockingQueue和 Deque ;BlockingQueue也是 java.util.concurrent
包下面的一个接口,而Deque则属于 java.util
。
来自官方的一段说明是,该接口定义了在deque两端访问元素的方法。提供了插入、删除和检查元素的方法。这些方法中的每个存在两种形式:一个抛出一个异常,如果操作失败,另一个返回一个特殊的值(无论是null或false,取决于操作)。插入操作的后一种形式是专为使用有容量限制deque实现;在大多数实现中,插入操作不会失败。
这个队列的特性其实是保证了先进先出的原则,与列表接口不同,此接口不提供对元素索引访问的支持。在实现中Deque不强制禁止空值,但是不推荐这样去做。
这个接口和上面一个长得有点像,但不要混淆了,干妹妹和干妹妹还不是一个意思呢(好污...)。BlockingQueue是用来对不同操作进行不同处理的(你这不是废话么...)BlockingQueue一共有四种处理形式,分别为 Throws exception、 Special value、 Blocks
(不是打篮球的盖帽)、 Times out
;其实核心意思就是不满足的就抛出异常、根据操作返回一个特定值true或false、让当前线程执行到成功为止,最后就是设定一个超时时间,以免第三步一直不成功。
下面是官方给出的一个例子,大家可以感受下:
class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
好啦,本篇文章就先到这里了,我们后面会继续讲这个神奇的concurrent包,大家有兴趣的话可以关注一下本文。