
Java基础
文章平均质量分 83
niulx111
keep learning
展开
-
CAS与ConcurrentLinkedQueue的实现
CASCAS,compare and swap的缩写,意思为比较并交换。从JDK 5 开始,Doug lea 给我们提供了Coucurrent包,让我们解决并发问题,CAS就是实现这个包的基础。CAS包含三个操作数--内存位置,预期位置和新值,当且仅当内存位置的值与预期位置的值相同的时候,处理器才会把该位置的值修改为新值,否则,处理器不做任何操作。无论如何,处理器都会在CAS指令之前返回该位置的值...原创 2018-05-11 11:36:58 · 885 阅读 · 0 评论 -
阻塞队列之LinkedBlockingQueue源码分析
LinkedBlockingQueue是一个基于单向链表实现的可选容量的阻塞队列,队列的头节点是等待时间最长的元素,队列的尾节点是等待时间最短的元素。新元素直接插入到尾节点的后面,成为新的尾节点,队列的检索操作在队列的头部获取元素。通常情况下,链表相比数组有更高的吞吐量,但是在大多数的并发应用程序中有不可预测的性能。LinkedBlockingQueue的构造方法可以设定容量大小,默认是Integ...原创 2018-05-24 00:30:44 · 801 阅读 · 0 评论 -
深入理解Condition
Condition是一个接口,它主要是由awiat和singal方法组成,awiat方法是放弃自身锁,进入阻塞状态,等待信号进行唤醒,singal是唤醒线程,让线程去重新竞争锁。它和Object的wait和notify方法是一样的。在queue队列中就用到了condition,弄明白condition的原理,对于我们对queue的认识可以更好的理解。看一下Condition方法public int...原创 2018-05-19 11:46:52 · 871 阅读 · 0 评论 -
CountDownLatch解析
CountDownLatch初始化的时候必须指定一个count,await方法会一直阻塞直到调用countdown方法,count为0,当count为0时,所有的等待线程都会被释放。count是不能被重置的,如果想重复使用count,可以考虑CyclicBarrier。CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者是线程之间的通信。CountDownLatch可以使...原创 2018-06-11 23:43:51 · 456 阅读 · 0 评论 -
线程池的使用
为什么要使用线程池就不说了,看一下常用的创建线程池的几种方式。newFixedThreadPool public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, ...原创 2018-06-08 22:51:24 · 354 阅读 · 0 评论 -
ThreadPoolExecutor源码剖析
线程池是Doug lea大神写的concurrent包中应用最广泛的一个框架,通常搭配阻塞队列一起使用,就我目前而言,ThreadPoolExecutor在Spring框架,RPC远程服务框架Dubbo,分布式协调应用服务Zookeeper中进行了广泛使用,可见ThreadPoolExecutor是多么重要的一个类。...原创 2018-06-05 01:19:24 · 2313 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier和CountDownLatch一样,是一个同步工具类,它允许一组线程相互等待直到达到某个common barrier point。在程序中CyclicBarrier是非常有用的,它适用于一组线程必须互相等待的情况。barrier被称为周期是因为等待的线程在释放后可以重用。构造函数/** * Creates a new {@code CyclicBarrier} ...原创 2018-06-16 16:48:05 · 324 阅读 · 0 评论 -
Callable和Future的使用
通常我们创建线程使用new Thread 和实现Runnable接口,但是这两种方式有一个缺陷,就是不能返回线程执行的结果,Doug lea又给我们提供了另一种方式,实现Callable接口,Callable只有一个方法,它是有返回值的,也可以抛出异常,它的执行结果可以被Future拿到。Future是一个接口,它可以对Callable任务的执行结果进行操作。 boolean cancel...原创 2018-06-09 23:11:23 · 3506 阅读 · 0 评论 -
ThreadLocal源码解读
1. 背景ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因两方面:加上注释源码也不过七八百行。结构清晰,代码简洁。本文重点导读ThreadLocal中的嵌套内部类...转载 2018-06-17 16:19:12 · 494 阅读 · 0 评论 -
阻塞队列之ArrayBlockingQueue源码分析
BlockingQueue是一个阻塞队列,在高并发场景应用的非常广泛,最常见的情景应该就是在线程池中,其他的比如在ZooKeeper源码中,dubbo源码中也大量使用了阻塞队列,我们经常使用的也就是ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,ConcurrentLinkedQueue这几种。ArrayBlockingQueueAr...原创 2018-05-22 22:15:55 · 533 阅读 · 0 评论 -
阻塞队列之SynchronousQueue
SynchronousQueue是一个特殊的阻塞队列,生产者插入操作后只能等待消费者移除操作,它只能存储一个元素。在SynchronousQueue中不能使用peek方法,因为元素只有被移除时才存在,只有消费者移除了元素生产者才能往队列中插入元素,当然更不能进行迭代。队列的头节点是第一个排队插入元素的线程,队列是不允许存储null的元素。生产者和消费者必须互相等待,这样经过一个元素的生产到消费的过...原创 2018-05-27 21:19:35 · 1009 阅读 · 0 评论 -
CopyOnWriteArrayList 分析
1、对于CopyOnWriteArrayList需要掌握以下几点创建:CopyOnWriteArrayList()添加元素:即add(E)方法获取单个对象:即get(int)方法删除对象:即remove(E)方法遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历注:CopyOnWriteA...转载 2018-05-25 17:52:43 · 215 阅读 · 0 评论 -
ArrayList源码分析
ArrayListArrayList就是动态数组,就是array的复杂版本。它可以动态的增加或者减少元素,可以在使用的过程中动态扩容,要注意,ArrayList是线程不安全的,它并没有使用Synchronized,CAS,Lock,一般只在单线程中使用,多线程中可以使用Vector或者CopyOnWriteArrayList。public class ArrayList<E> exte...原创 2018-05-01 13:27:42 · 708 阅读 · 1 评论 -
HashMap源码解析
HashMap是一个基于键值对存储的数据结构,JDK 1.8中对HashMap的底层实现做出了一些优化,主要是引进了红黑树这一数据结构。HashMap结构HashMap是由数组+链表+红黑树组成,桶中可能是链表,也可能是红黑树,当链表的长度>=7,就尝试把链表转化为红黑树,引入红黑树主要是为了降低遍历层次,加快访问效率。static class Node<K,V> impleme...原创 2018-05-05 10:54:37 · 425 阅读 · 0 评论 -
LinkedList源码分析
以前听同学说LinkedList是循环双向链表,感觉总是很惊奇,头节点Node的prev明明是null,并没有指向尾节点,至少从1.7版本开始LinkedList是直线链表,google了一下,Oracle从1.7开始,对LinkedList做了优化,将环形结构变成了链表结构。所以我们还是应该时刻关注版本的变更。虽然现在java8停止了维护,但是大部分公司还没有应用java9或者刚出的java10...原创 2018-05-03 20:26:53 · 399 阅读 · 0 评论 -
AQS框架源码分析
AQS就是AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。...原创 2018-05-15 15:59:24 · 7924 阅读 · 3 评论 -
可重入锁ReentrantLock的实现原理
ReentrantLock是Lock的默认实现,在了解ReentrantLock之前,我觉得有必要先看一下AQS框架分析和condition,ReentrantLock继承自AQS,只不过子类重写了AQS的部分方法。构造方法 public ReentrantLock() { sync = new NonfairSync(); } public Reentra...原创 2018-05-19 16:29:43 · 587 阅读 · 0 评论 -
LinkedHashMap源码解析
LinkedHashMap继承了HashaMap,它拥有HashMap的所有特性。LinkedHashMap是LinkedList与HashMap的结合体。通过双向链表来保持迭代顺序,正是因为这个特性,LinkedHashMap提供了空的一个方法,重写此方法可以很好的实现Lru算法。LinkedHashMapLinkedHashMap默认是按照插入顺序进行排序的,它的本质还是HashMap和双向链...原创 2018-05-06 18:00:36 · 538 阅读 · 0 评论 -
TreeMap源码分析
TreeMap内部是使用红黑树的数据结构来实现的,同时,TreeSet的内部各方法的原理都是通过TreeMap来操作的,所以要想弄懂TreeMap,红黑树一定要要懂,懂了红黑树,再来看TreeMap的源码,还是很容易的! 看此篇文章前,请看我的另一篇红黑树文章:红黑树精讲一、红黑树的要点红黑树的4...转载 2018-05-07 16:57:09 · 258 阅读 · 0 评论 -
ConcurrentHashMap源码分析
注:本文源码是JDK8的版本,与之前的版本有较大差异ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜...转载 2018-05-07 17:41:51 · 288 阅读 · 0 评论 -
Semaphore解析
Semaphore,即信号计数量,通常来说,Semaphore管理了一系列许可证,每个acquire方法都会阻塞直到拿到许可证,每个release方法都会释放一个许可证,可能会释放一个阻塞的auquire方法。实际上,许可证并不存在,Semaphore仅仅保持了一组可用的数量和行为。Semaphore经常被用来限制获取某种资源的线程数。Semaphore也存在公平和非公平两种模式,无论公平还是非公...原创 2018-06-10 19:16:55 · 682 阅读 · 0 评论