探秘高并发之java.util.concurrent(一)

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了探秘高并发之java.util.concurrent(一)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

大家好,最近由于公司的事情不是很多,准备开篇写一写concurrent一块,因为最近好多面试者对这个都不是很了解,有的是知其然不知其所以然,我写这篇(系列文章的初衷是为了总结和归纳这一块,如果本文能够对大家带来一定的帮助,那么一定是我莫大的荣耀,好了,话不多说我们开始探秘concurrent吧。

clipboard.png

首先从字面意思我们能理解到concurrent是“同时发生的”,在java中自然是用来做并发使用的,这个concurrent 包是java5才提出的,然而经过几个版本的更迭,目前已经是大家都会深入用到,或者是多少会接触到的,其实在java中已经有ThreadRunnable等多线程的实现;我们为什么要用到concurrent包来做呢?下面我将带大家一步一步的了解。

针对高质量Java多线程并发程序设计时,为死崩等现象的出现,比如使用java之前的wait()notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担。为了减少甚至是去除咱们这种后顾之忧, Doug Lea为大家推出了这个解决方案,让众多java开发者如沐春风。

在java8中concurrent一共有21个接口、38个类其中包括抽象类和内部类、1个枚举类、6种异常方式,当然这个数字都不重要,大家在看api的时候只会找自己关注的部分。

1. BlockingDeque

BlockingDeque继承自BlockingQueue和 Deque ;BlockingQueue也是java.util.concurrent包下面的一个接口,而Deque则属于java.util

来自官方的一段说明是,该接口定义了在deque两端访问元素的方法。提供了插入、删除和检查元素的方法。这些方法中的每个存在两种形式:一个抛出一个异常,如果操作失败,另一个返回一个特殊的值(无论是null或false,取决于操作)。插入操作的后一种形式是专为使用有容量限制deque实现;在大多数实现中,插入操作不会失败。

这个队列的特性其实是保证了先进先出的原则,与列表接口不同,此接口不提供对元素索引访问的支持。在实现中Deque不强制禁止空值,但是不推荐这样去做。

2. BlockingQueue

这个接口和上面一个长得有点像,但不要混淆了,干妹妹和干妹妹还不是一个意思呢(好污...)。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包,大家有兴趣的话可以关注一下本文。

脚本宝典总结

以上是脚本宝典为你收集整理的探秘高并发之java.util.concurrent(一)全部内容,希望文章能够帮你解决探秘高并发之java.util.concurrent(一)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。