JDK容器与并发
文章平均质量分 75
Architect0719
探索java技术、web技术
展开
-
JDK容器与并发—数据结构
若想提高编程水平,一种方式就是看优秀框架的源码,JDK的源码就是一个很好例子,顺便也熟悉一下经常用到的类。在了解过程中,可以了解其框架设计方式,为什么要这样设计。先看看list 的UML类图:原创 2016-04-20 17:21:59 · 3686 阅读 · 0 评论 -
JDK容器与并发—Map—TreeMap
概述 基于红黑树的NavigableMap,非线程安全。1)containsKey、get、put、remove操作的时间复杂度为log(n);2)迭代器fail-fast。数据结构 红黑树:private transient Entry root = null; // 根节点// tree节点static final class Entry im原创 2016-04-20 17:41:45 · 944 阅读 · 0 评论 -
JDK容器与并发—Queue
框架概览Queue比较原创 2016-04-20 17:42:09 · 633 阅读 · 0 评论 -
JDK容器与并发—Queue—Interface
框架概览接口介绍Queue 俗称队列,其设计目标是存储处理前的元素。在Collection基础上,新增了入队、出队、访问队首元素的方法:1)Queue有两套功能相同的方法:add、remove、element分别为入队、出队、访问队首元素方法的抛出异常版本;offer、poll、peek则为返回特殊值的版本:2)offer在有界队列中常用,当队原创 2016-04-20 17:42:59 · 5092 阅读 · 0 评论 -
JDK容器与并发—Queue—ArrayBlockingQueue
概述 基于数组的有界阻塞队列。1)FIFO;2)ArrayBlockingQueue是经典的有界缓存的实现,其内是固定大小的数组缓存,生产者向其中插入元素,消费者从其取出元素;3)支持公平锁,默认为非公平锁,公平锁会降低吞吐量但更稳定,避免某个线程阻塞不工作的情况;数据结构 Object数组,逻辑上是环形数组:/** The queued i原创 2016-04-20 17:43:26 · 759 阅读 · 0 评论 -
JDK容器与并发—Queue—LinkedBlockingQueue
概述 基于单链表的有界或无界阻塞队列。1)FIFO;2)可用带容量参数的构造函数设置队列的容量,否则为Integer.MAX_VALUE;3)在大部分并发场景中,基于链表的队列比基于数组的队列有更高的吞吐量,但性能的预测性更低。数据结构 单链表,一把take锁,一个take条件,一把put锁,一个put条件:// 链表首节点// head.it原创 2016-04-20 17:43:47 · 841 阅读 · 0 评论 -
JDK容器与并发—并发
关于可见性与原子性 在并发操作中,可见性、原子性、有序性都会对并发读写产生影响(注:并发读读、像ConcurrentHashMap那样的不同Segment间的并发写写是不用考虑并发的)。可见性是为了保证线程的工作内存中的数据是最新的,且有变化及时刷新到主内存中。原子性是指在多线程并发中,任何时候都只有一个线程执行一段代码,像volatile i++的操作,即使一个线程最开始拿到最新的原创 2016-04-20 17:44:09 · 470 阅读 · 0 评论 -
JDK容器与并发—Queue—ConcurrentLinkedQueue
概述 基于单链表的无界队列,线程安全。1)FIFO;2)wait-free;3)迭代器弱一致性;4)size()非固定时间,由于异步特新,若遍历过程有修改,则可能不正确;批量操作addAll、removeAll、retainAll、containsAll、equals、toArray不保证原子性;5)遵守内存一致性原则;数据结构 基于单链表:原创 2016-08-28 10:28:24 · 761 阅读 · 0 评论 -
JDK容器与并发—Queue—DelayQueue
概述 元素为实现Delayed接口的无界阻塞队列。数据结构 基于优先队列,一把锁、一个条件:// 增删查公用的锁private transient final ReentrantLock lock = new ReentrantLock();// 用优先队列存储元素private final PriorityQueue q = new PriorityQ原创 2016-08-28 10:29:52 · 855 阅读 · 0 评论 -
JDK容器与并发—Queue—PriorityBlockingQueue
概述 基于优先堆的无界阻塞队列,PriorityQueue的线程安全版本。数据结构 基于数组的平衡二叉堆,在PriorityQueue基础上,增加了一把锁、一个条件:private transient Object[] queue;// 增删查公用的锁private final ReentrantLock lock;// 队列为空时,阻塞take/po原创 2016-08-28 10:30:28 · 2146 阅读 · 0 评论 -
JDK容器与并发—Queue—PriorityQueue
概述 基于优先堆的无界优先队列,非线程安全。1)add、offer、remove、poll的时间复杂度为O(log(n));remove(Object)、contains(Object)为线性时间;peek、element、size为固定时间。数据结构 基于数组的平衡二叉堆:// queue[n]元素的两个children为queue[2*n+1]、queu原创 2016-08-28 10:31:11 · 1277 阅读 · 0 评论 -
JDK容器与并发—Queue—SynchronousQueue
概述 无容量的同步队列,即入队线程通过SynchronousQueue将节点传递给出队线程,若暂时无出队线程接收,则一直等待;反之亦然。数据结构构造器// 无参构造public SynchronousQueue() { this(false);}// 带fair构造public SynchronousQueue(boolean fair) { tra原创 2016-08-28 10:25:37 · 510 阅读 · 0 评论 -
JDK容器与并发—Map—NavigableMap
框架概览接口说明ConcurrentMapSortedMap 利用key进行排序,采用key的Comparable接口或Comparator进行比较,主要涉及排序的subMap、firstKey、lastKey接口:NavigableMap相对于SortedMap,主要增加了查找节点的方法、删除first、last Entry、获取降序Ma原创 2016-04-20 17:41:03 · 535 阅读 · 0 评论 -
JDK容器与并发—Map—ConcurrentSkipListMap
概述 基于跳表实现的ConcurrentNavigableMap。1)containsKey、get、put、remove等操作的平均时间复杂度为log(n);size非固定时间操作,因异步特性,需要遍历所有节点才能确定size,且可能不是正确的值如果遍历过程中有修改;批量操作:putAll、equals、toArray、containsValue、clear非原子性。2)增原创 2016-04-20 17:40:40 · 5337 阅读 · 0 评论 -
JDK容器与并发—JDK容器框架
本系列文章所讨论的《JDK容器与并发》都是基于jdk 1.7.0_79版本。JDK中涉及的容器及Map框架图如下:Collection(俗称的容器)包括List、Set、Queue,原创 2016-04-20 17:26:17 · 947 阅读 · 0 评论 -
JDK容器与并发—List
List框架概览常用的List有ArrayList、LinkedList、CopyOnWriteArrayList,Vector、Stack已经过时,很少用,下面一一详解。List实现ArrayList 基于数组实现的容量可变的非线程安全List。1)其实现基本与Vector等效,Vector为线程安全的,但是同步效率低,基本不用。2)时间复杂度:size原创 2016-04-20 17:27:33 · 511 阅读 · 0 评论 -
JDK容器与并发—List—ArrayList
概述 基于数组实现的容量可变的非线程安全List。1)其实现基本与Vector等效,Vector为线程安全的,但是同步效率低,所以基本不用。2)时间复杂度:size、isEmpty、get、set为O(1);iterator、listIterator遍历所有元素为O(N)(N为容量);add(E e) n个元素为O(n);其他操作一般是线性时间。3)fail-fast:i原创 2016-04-20 17:28:03 · 462 阅读 · 0 评论 -
JDK容器与并发—List—LinkedList
概述 基于双向链表的List实现,也实现了Deque接口,无界List。1)非线程安全;2)fail-fast:同ArrayList。数据结构 基于双链表,维护first、last引用:/** * Pointer to first node. * Invariant: (first == null && last == null) || *原创 2016-04-20 17:28:45 · 720 阅读 · 0 评论 -
JDK容器与并发—List—CopyOnWriteArrayList
概述 俗称读写ArrayList,线程安全的ArrayList版本,其所有写操作都是基于底层数组的副本操作,成功后再替换底层数组,可以理解为基于"snapshot" array的并发,适用于读多写少的并发环境。1)采用"snapshot" iterator,在遍历过程中,底层数组是不会修改的,不存在并发干扰,不会抛出ConcurrentModificationException原创 2016-04-20 17:33:21 · 812 阅读 · 0 评论 -
JDK容器与并发—Map
框架概览Map比较原创 2016-04-20 17:33:53 · 465 阅读 · 0 评论 -
JDK容器与并发—Map—HashMap
概述 基于数组+单链表优点构造的Map,非线程安全。1)实现原理等效于Hashtable,Hashtable虽然为线程安全的,但由于其读写方法均为synchronized,并发效率低;2)在哈希函数哈希合理情况下,基础操作get、put等为固定时间;容器视图迭代器的遍历时间与(table数组长度+所有bucket包含的键值对数)成比例;3)影响性能的两个参数:初始容量、负原创 2016-04-20 17:34:41 · 564 阅读 · 0 评论 -
JDK容器与并发—Map—LinkedHashMap
概述 用双向链表遍历整个key-value对,顺序为key插入的顺序,不会带来treemap的成本 Map copy = new LinkedHashMap(m);building LRU caches.put get、putall会访问到,不会收到迭代器影响removeEldestEntry用于清空旧的缓存其性能较hashmap稍差,应为要维护链表;但是原创 2016-04-20 17:35:09 · 1582 阅读 · 0 评论 -
JDK容器与并发—Map—WeakHashMap
概述 基于弱引用键实现的HashMap,非线程安全。1)当key所引用的对象只有弱引用时,在GC回收该对象后,会自动删除所关联的Entry;2)其行为部分依赖GC;3)value是强引用的。确保value没有直接或间接引用key,否则会阻止key引用对象的回收。间接引用:value1强引用key2的对象,其所关联的value2强引用key1的对象。4)迭代器fail-原创 2016-04-20 17:35:37 · 1027 阅读 · 0 评论 -
JDK容器与并发—Map—IdentityHashMap
概述 基于数组,用==比较key的类HashMap,非线程安全。1)在System#identityHashCode哈希合理情况下,基础操作get、put等为固定时间;2)影响性能的参数:期望最大键值对数(即键值对threshold),该参数在初始化时决定bucket数。如果map中的键值对数超过了该参数,bucket数则增长,进一步导致rehash;另外,容器视图迭代器原创 2016-04-20 17:36:42 · 695 阅读 · 0 评论 -
JDK容器与并发—Map—ConcurrentHashMap
概述 线程安全的HashMap版本。1)基本思想:将整个大的hash table进一步细分成小的hash table,即Segment;2)读不用加锁;写操作在所在的Segmenet上加锁,而不是整个HashMap,Hashtable就是所有方法竞争Hashtable上的锁,导致并发效率低;3)采用懒构造segment(除了segments[0]),以减少初始化内存。原创 2016-04-20 17:40:15 · 4329 阅读 · 0 评论 -
JDK容器与并发—Queue—LinkedTransferQueue
概述 基于单链表的无界传输队列,线程安全。1)FIFO;2)size()非固定时间,由于异步特新,若遍历过程有修改,则可能不正确;批量操作addAll、removeAll、retainAll、containsAll、equals、toArray不保证原子性;3)遵守内存一致性原则。数据结构 基于单链表:// 队列节点// 依赖Unsafe机制最小化原创 2016-08-28 10:26:28 · 2051 阅读 · 0 评论