项目中用到了一个叫做 Disruptor 的队列,今天楼主并不是要介绍 Disruptor 而是想巩固一下基础扒一下 JDK 中的阻塞队列,听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,最经典的就是去银行办理业务等. 当然在计算机世界中,队列是属于一种数据结构,队列采用的FIFO(first in firstout),新元素(等待进入队列的元素)总是被插入到尾部,而读取的时候总是从头部开始读取.在计算中队列一般用来做排队(如线程池的等待排队,锁的等待排队),用来做解耦(生产者消费者…
正如上篇文章聊聊 JDK 阻塞队列源码(ReentrantLock实现)所说,队列在我们现实生活中队列随处可见,最经典的就是去银行办理业务,超市买东西排队等.今天楼主要讲的就是JDK中安全队列的另一种实现使用CAS算法实现的安全队列. JDK 中的队列 在JDK中的队列都实现了 java.util.Queue 接口,下面就是楼主要说的无锁版本的队列实现: 队列名字 是否加锁 数据结构 LinkedTransferQueue 否 链表 ConcurrentLinkedQueue 否 链表 Link…
JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在这篇文章当中我们将仔细介绍JDK具体是如何实现数组阻塞队列的. 阻塞队列的功能 而在本篇文章所谈到的阻塞队列当中,是在并发的情况下使用的,上面所谈到的是队列是并发不安全的,但是阻塞队列在并发下情况是安全的.阻塞队列的主要的需求如下: 队列基础的功能需要有,往队列当中放数据,从队列当中取数据. 所有的…
上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文章来了解剩下的四种阻塞队列. 读完本文你将了解: 七种阻塞队列的后四种 DelayQueue DelayQueue 的关键属性 实现 Delayed 接口 延时阻塞队列如何实现 DelayQueue 使用场景 SynchronousQueue LinkedTransferQueue Transfer…
上篇文章 趣谈并发3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务.这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什么. 读完你将了解: 什么是阻塞队列 七种阻塞队列的前三种 ArrayBlockingQueue 看它的主要属性 构造函数 四种添加元素方法的实现 四种获取元素的实现 LinkedBlockingQueue LinkedBlockingQueue 属性 LinkedBlockingQueue 添加元素 LinkedBlockingQueu…
深入剖析(JDK)ArrayQueue源码 前言 在本篇文章当中主要给大家介绍一个比较简单的JDK为我们提供的容器ArrayQueue,这个容器主要是用数组实现的一个单向队列,整体的结构相对其他容器来说就比较简单了. ArrayQueue内部实现 在谈ArrayQueue的内部实现之前我们先来看一个ArrayQueue的使用例子: public void testQueue() { ArrayQueue<Integer> queue = new ArrayQueue<>(10);…
在写这篇博客之前我查了很久发现全网都没有一篇写httpserver源码解析的 所以今天就由我来为大家解析一下httpserver的源码.(这里我会去掉其中的https部分的源码,只讲http部分,对httpserver中https的实现感兴趣的读者可以尝试自己去阅读,这部分并不复杂) 第一次在没有参考资料的情况下写这么长一篇源码解析,可能会有很多错误和讲不清楚的地方,希望大家尽量指出来. 本文链接 https://www.cnblogs.com/fatmanhappycode/p/1261442…
一:观察者模式简介 二:jdk实现观察者模式的源码 三:实际例子 四:观察者模式的优点和不足 五:总结 一:观察者模式简介 有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统.这段话引自百度百科,粗看很懵.在观察…
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初的键值对类,它不可以存储null作为key和value,目前这个类早已不被使用了.目前都是在使用Map接口,它是可以存储null值作为key和value,但Map的key是不可以重复的.其常用的实现类主要有HashMap,TreeMap,ConcurrentHashMap等 HashMap源码解读…
继续上篇ReentrantLock分析如何唤醒线程: 当调用lock.unlock()方法最终调用AQS类中的release方法,开始释放锁 tryRelease(1)方法在Sync对象中实现,首先会检查当前占用锁线程是否是释放线程,如果不是则抛出异常,然后再设置state为0,因为独占锁只有一个线程可以操作,所以不需要cas操作 接下来看release(1)方法,获取头节点,判断如果不为0则调用unparkSuccessor(node)方法,首先更新头节点状态为0,获取next节点, 如果ne…