- 博客(14)
- 资源 (3)
- 问答 (2)
- 收藏
- 关注
原创 JUC--LinkedBlockingQueue源码分析 (基于JDK1.8) 未完待续
1 概述LinkedBlockingQueue是一个有界性可选的阻塞队列,也就是再初始化的时候如果设置了大小,则大小就是固定的,否则队列的大小为Integer.MAX_VALUE。通常为了防止数据的膨胀,我们通常再初始化的时候给链表设置一个初始大小。LinkedBlockingQueue是基于链表实现的一个FIFO队列,链表的首节点是添加时间最久的数据,而链表的尾节点是最早添加的数据,所以...
2018-09-27 20:36:17 205
原创 JUC--ArrayBlockingQueue源码分析 (基于JDK1.8)
1 概述这是一个依赖于数组实现的有界的阻塞队列,采用先进先出的规则,队列的头元素是入队最久的元素,队列的尾元素是入队时间最晚的元素。队列的大小在队列初始化的时候一旦确定了就没法进行改变,当尝试向满队列中插入数据和从空队列中获取数据都将产生阻塞。另一方面这个队列也可以保证等待线程的公平性,只需要再初始化的时候设置公平性即可,当然,默认情况下是非公平的。2 使用示例ArrayBlockin...
2018-09-27 18:32:47 243
原创 JUC--队列概述
1 概述Java中的队列是一个FIFO的数据结构,适用于生产者消费者模式。Queue接口与List、Set同一级别,都是继承了Collection接口,LinkedList也实现了Deque接口。当然java中的队列有阻塞和非阻塞队列,下面我们就来看一看Java中队列都有哪些实现。2 类图下面我们来看一下java中队列的家庭成员。3 详细说明3.1 QueueQue...
2018-09-26 19:52:53 781
原创 Java集合框架--HashSet源码分析(基于JDK1.8)
1 概述前面的文章,我们分析了List和Map的一些实现类。现在我们开始分析Set的实现类。Set和List相同都是用于存放数据的集合,不同的是Set中的元素不允许重复(通过hashCode和equals函数来保证不重复性),如果数据相同就会进行覆盖。Set的实现是依赖于Map的实现,我们知道Map中的key也是不允许重复的。接下来我们就来看一下Set的具体实现类HashMap的实现吧...
2018-09-26 16:23:55 245
原创 Java集合框架--LinkedHashMap源码分析(基于JDK1.8)
1 概述前面我们对HashMap的源码进行了分析(详情可以参考:Java集合框架--HashMap源码分析(二)(基于JDK1.8),我们知道HashMap针对数据的插入是通过计算key的hash值和table大小来确定在数组及链表当中的位置的,所以HashMap没法保存插入数据的顺序。为了保存插入元素的顺序,就有了我们现在要提到的LinkedHashMap,从类的命名我们可以猜想,Linke...
2018-09-26 11:32:10 233
原创 JUC--ConcurrentHashMap源码分析(二)(基于JDK1.8)
1 概述前面我们分析了ConcurrentHashMap(JDK1.7)(请参考JUC--ConcurrentHashMap源码分析(一)(基于JDK1.7))和HashMap(JDK1.8)(请参考Java集合框架--HashMap源码分析(二)(基于JDK1.8))的源码,我们直到ConcurrentHashMap其实就是针对HashMap(JDK1.7)进行了分段加锁的方式,也就是针对H...
2018-09-25 11:19:48 398
原创 JUC--ConcurrentHashMap源码分析(一)(基于JDK1.7)
1 概述前面分析研究了HashMap,我们知道HashMap不是线程安全的,那么如果需要线程安全的HashMap怎么办呢?这个时候我们有几种解决方法。(1)使用HashTable代替HashMap;(2)使用Collections.synchronizeMap(hashMap);(3)使用ConcurrentHashMap;针对这三种方法得区别我们在文章后面再谈,下面我们就针对...
2018-09-18 11:02:34 239
原创 Java集合框架--HashMap源码分析(一)(基于JDK1.7)
1 概述Map是我们常使用得一种用于存放键值对的数据结构,现在我们来分析一下Map的实现类HashMap的具体实现,我们直到JDK1.8实现HashMap是使用数组+链表的数据结构,而JDK1.8为了提高查询效率改进了数据结构,加入了红黑树的数据结构来实现。现在在我们分析JDK1.8的HashMap之前先来看一下JDK1.7的实现。2 JDK1.7实现2.1 数据结构图我们首先来看...
2018-09-12 09:52:26 230
原创 JUC--Semaphore源码分析(基于JDK1.8)
1 概述通过前面(参考JUC-- Semaphore学习(一)简介和使用 )对Semaphore的介绍,我们对Semaphore有了一个基本的认识,我们知道Semaphore通常用于限制对资源使用的线程数量,现在就要针对Semaphore的源码进行分析,Semaphore的结构如下:从上图我们可以发现,这里又出现了AQS的身影,我们可以看出AQS的重要性。所以再学习JUC的时候非常有必...
2018-09-07 17:23:22 269 1
原创 JUC--Semaphore简介和使用
1 概述通过查看JDK的API,我们可以发现对Semaphore的定义如下:信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。Semaphore(信号量)限制着访问某些资源...
2018-09-06 16:22:50 421
原创 JUC--CyclicBarrier源码分析(基于JDK1.8)
1 概述通过前面对CyclicBarrier(请参考JUC-- CyclicBarrier学习(一)简介和使用)的介绍,我们对CyclicBarrier的使用有了一个深度的认识,现在就要针对CyclicBarrier的源码进行分析,CyclicBarrier的结构如下:从上图我们可以猜想CyclicBarrier的实现主要就是依靠ReentrantLock和Condition。2 ...
2018-09-06 10:38:11 220
原创 JUC--CyclicBarrier简介和使用
1 概述CyclicBarrier允许一组线程相互等待,直到到达某个公共的屏障点这组线程才继续执行。在涉及一组固定大小的线程的程序当中,这组线程必须相互等待,这个时候CyclicBarrier就显得非常有用了,由于Barrier(栅栏)在释放线程后可以从新使用,所以Barrier被称为Cyclic(循环)Barrier(栅栏)。2 示例下面我们来看看CyclicBarrier是如何使用...
2018-09-06 09:22:03 322
原创 JUC--Condition源码分析(基于JDK1.8)
1 概述通过前面的文章(JUC--Condition学习(一)简介和使用),我们对Condition有了一个初步的认识,并且我们也知道了如何使用Condition,现在我们就来看一看Condition到底是如何实现线程的等待和唤醒的。2 等待队列在我们学习AQS的时候,我们知道当线程获取锁失败的时候会进入CLH队列,以等待状态(WAITING)存在于同步队列。而当我们调用Conditi...
2018-09-04 11:46:11 471
原创 JUC--Condition简介和使用
1 概述我们知道针对synchronized关键字实现的加锁操作操作我们可以使用wait和notify来实现线程的等待和唤醒线程,但是我们清楚这个时候就只能有一个线程进入等待,那么如果我们想要多个线程等待,同时我们可以唤醒多个线程怎么办呢?这个时候就需要用到Lock对应的Condition来完成了。我们知道针对Lock与synchronized的区别在于,Lock的操作更加灵活,并且可以响...
2018-09-04 10:24:09 2034
Mybatis--SQL解析流程图
2018-11-02
Java程序服务器性能调优
2019-05-07
mongoDB和Redis在java web中的使用场景
2017-11-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人