自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Niulx

Keep learning

  • 博客(23)
  • 收藏
  • 关注

原创 Dubbo-service启动过程

2018-08-15 12:25:30 247

转载 ThreadLocal源码解读

1. 背景ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因两方面:加上注释源码也不过七八百行。结构清晰,代码简洁。本文重点导读ThreadLocal中的嵌套内部类...

2018-06-17 16:19:12 427

原创 CyclicBarrier

CyclicBarrier和CountDownLatch一样,是一个同步工具类,它允许一组线程相互等待直到达到某个common barrier point。在程序中CyclicBarrier是非常有用的,它适用于一组线程必须互相等待的情况。barrier被称为周期是因为等待的线程在释放后可以重用。构造函数/** * Creates a new {@code CyclicBarrier} ...

2018-06-16 16:48:05 276

原创 CountDownLatch解析

CountDownLatch初始化的时候必须指定一个count,await方法会一直阻塞直到调用countdown方法,count为0,当count为0时,所有的等待线程都会被释放。count是不能被重置的,如果想重复使用count,可以考虑CyclicBarrier。CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者是线程之间的通信。CountDownLatch可以使...

2018-06-11 23:43:51 358

原创 Semaphore解析

Semaphore,即信号计数量,通常来说,Semaphore管理了一系列许可证,每个acquire方法都会阻塞直到拿到许可证,每个release方法都会释放一个许可证,可能会释放一个阻塞的auquire方法。实际上,许可证并不存在,Semaphore仅仅保持了一组可用的数量和行为。Semaphore经常被用来限制获取某种资源的线程数。Semaphore也存在公平和非公平两种模式,无论公平还是非公...

2018-06-10 19:16:55 624

原创 Callable和Future的使用

通常我们创建线程使用new  Thread 和实现Runnable接口,但是这两种方式有一个缺陷,就是不能返回线程执行的结果,Doug lea又给我们提供了另一种方式,实现Callable接口,Callable只有一个方法,它是有返回值的,也可以抛出异常,它的执行结果可以被Future拿到。Future是一个接口,它可以对Callable任务的执行结果进行操作。 boolean cancel...

2018-06-09 23:11:23 3431

原创 线程池的使用

为什么要使用线程池就不说了,看一下常用的创建线程池的几种方式。newFixedThreadPool public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, ...

2018-06-08 22:51:24 312

原创 ThreadPoolExecutor源码剖析

线程池是Doug lea大神写的concurrent包中应用最广泛的一个框架,通常搭配阻塞队列一起使用,就我目前而言,ThreadPoolExecutor在Spring框架,RPC远程服务框架Dubbo,分布式协调应用服务Zookeeper中进行了广泛使用,可见ThreadPoolExecutor是多么重要的一个类。...

2018-06-05 01:19:24 2252

原创 阻塞队列之SynchronousQueue

SynchronousQueue是一个特殊的阻塞队列,生产者插入操作后只能等待消费者移除操作,它只能存储一个元素。在SynchronousQueue中不能使用peek方法,因为元素只有被移除时才存在,只有消费者移除了元素生产者才能往队列中插入元素,当然更不能进行迭代。队列的头节点是第一个排队插入元素的线程,队列是不允许存储null的元素。生产者和消费者必须互相等待,这样经过一个元素的生产到消费的过...

2018-05-27 21:19:35 935

原创 阻塞队列之LinkedBlockingQueue源码分析

LinkedBlockingQueue是一个基于单向链表实现的可选容量的阻塞队列,队列的头节点是等待时间最长的元素,队列的尾节点是等待时间最短的元素。新元素直接插入到尾节点的后面,成为新的尾节点,队列的检索操作在队列的头部获取元素。通常情况下,链表相比数组有更高的吞吐量,但是在大多数的并发应用程序中有不可预测的性能。LinkedBlockingQueue的构造方法可以设定容量大小,默认是Integ...

2018-05-24 00:30:44 748

原创 阻塞队列之ArrayBlockingQueue源码分析

BlockingQueue是一个阻塞队列,在高并发场景应用的非常广泛,最常见的情景应该就是在线程池中,其他的比如在ZooKeeper源码中,dubbo源码中也大量使用了阻塞队列,我们经常使用的也就是ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,ConcurrentLinkedQueue这几种。ArrayBlockingQueueAr...

2018-05-22 22:15:55 476

原创 可重入锁ReentrantLock的实现原理

ReentrantLock是Lock的默认实现,在了解ReentrantLock之前,我觉得有必要先看一下AQS框架分析和condition,ReentrantLock继承自AQS,只不过子类重写了AQS的部分方法。构造方法 public ReentrantLock() { sync = new NonfairSync(); } public Reentra...

2018-05-19 16:29:43 536

原创 深入理解Condition

Condition是一个接口,它主要是由awiat和singal方法组成,awiat方法是放弃自身锁,进入阻塞状态,等待信号进行唤醒,singal是唤醒线程,让线程去重新竞争锁。它和Object的wait和notify方法是一样的。在queue队列中就用到了condition,弄明白condition的原理,对于我们对queue的认识可以更好的理解。看一下Condition方法public int...

2018-05-19 11:46:52 777

原创 AQS框架源码分析

AQS就是AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。...

2018-05-15 15:59:24 7748 3

原创 CAS与ConcurrentLinkedQueue的实现

CASCAS,compare and swap的缩写,意思为比较并交换。从JDK 5 开始,Doug lea 给我们提供了Coucurrent包,让我们解决并发问题,CAS就是实现这个包的基础。CAS包含三个操作数--内存位置,预期位置和新值,当且仅当内存位置的值与预期位置的值相同的时候,处理器才会把该位置的值修改为新值,否则,处理器不做任何操作。无论如何,处理器都会在CAS指令之前返回该位置的值...

2018-05-11 11:36:58 832

原创 LinkedHashMap源码解析

LinkedHashMap继承了HashaMap,它拥有HashMap的所有特性。LinkedHashMap是LinkedList与HashMap的结合体。通过双向链表来保持迭代顺序,正是因为这个特性,LinkedHashMap提供了空的一个方法,重写此方法可以很好的实现Lru算法。LinkedHashMapLinkedHashMap默认是按照插入顺序进行排序的,它的本质还是HashMap和双向链...

2018-05-06 18:00:36 472

原创 HashMap源码解析

HashMap是一个基于键值对存储的数据结构,JDK 1.8中对HashMap的底层实现做出了一些优化,主要是引进了红黑树这一数据结构。HashMap结构HashMap是由数组+链表+红黑树组成,桶中可能是链表,也可能是红黑树,当链表的长度>=7,就尝试把链表转化为红黑树,引入红黑树主要是为了降低遍历层次,加快访问效率。static class Node<K,V> impleme...

2018-05-05 10:54:37 395

原创 LinkedList源码分析

以前听同学说LinkedList是循环双向链表,感觉总是很惊奇,头节点Node的prev明明是null,并没有指向尾节点,至少从1.7版本开始LinkedList是直线链表,google了一下,Oracle从1.7开始,对LinkedList做了优化,将环形结构变成了链表结构。所以我们还是应该时刻关注版本的变更。虽然现在java8停止了维护,但是大部分公司还没有应用java9或者刚出的java10...

2018-05-03 20:26:53 373

原创 ArrayList源码分析

ArrayListArrayList就是动态数组,就是array的复杂版本。它可以动态的增加或者减少元素,可以在使用的过程中动态扩容,要注意,ArrayList是线程不安全的,它并没有使用Synchronized,CAS,Lock,一般只在单线程中使用,多线程中可以使用Vector或者CopyOnWriteArrayList。public class ArrayList<E> exte...

2018-05-01 13:27:42 623 1

原创 Dubbo-service--服务启动

通过注解方式(service)进行暴漏服务1. AnnotationBean通过调用postProcessAfterInitialization方法,得到(service)注解上的内容,创建一个ServiceBean。2. 为ServiceBean 注入application,module,registries,provider,monitor,protocol等,初始化信息,在此过程...

2018-08-18 23:01:22 2121

转载 CopyOnWriteArrayList 分析

1、对于CopyOnWriteArrayList需要掌握以下几点创建:CopyOnWriteArrayList()添加元素:即add(E)方法获取单个对象:即get(int)方法删除对象:即remove(E)方法遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历注:CopyOnWriteA...

2018-05-25 17:52:43 183

转载 ConcurrentHashMap源码分析

注:本文源码是JDK8的版本,与之前的版本有较大差异ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜...

2018-05-07 17:41:51 250

转载 TreeMap源码分析

  TreeMap内部是使用红黑树的数据结构来实现的,同时,TreeSet的内部各方法的原理都是通过TreeMap来操作的,所以要想弄懂TreeMap,红黑树一定要要懂,懂了红黑树,再来看TreeMap的源码,还是很容易的!   看此篇文章前,请看我的另一篇红黑树文章:红黑树精讲一、红黑树的要点红黑树的4...

2018-05-07 16:57:09 226

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除