随笔分类 -  jdk源码

jdk源码
摘要:LinkedBlockingQueue LinkedBlockingQueue是一个可以指定容量大小的以单链表为数据结构实现的队列,默认容量大小为 ,可以在构造方法中传入容量大小。 内部持有两个锁:读锁 ,控制元素的移除,对应条件 ,如果队列空,则阻塞线程; 写锁 ,控制元素的新增,对应条件 ,如果 阅读全文
posted @ 2020-02-26 23:01 程序员肥猫 阅读(284) 评论(0) 推荐(0)
摘要:ArrayBlockingQueue 是一个基于数组存储实现的有界阻塞队列,新增、获取、移除元素由内部持有的重入锁控制。 重入锁支持公平和非公平模式,默认使用非公平模式。 如果新增移除是阻塞的,那么新增时如果队列满了,会在 上等待,移除元素时如果队列空了,会在 上等待。 提供了读指针 和写指针 控制 阅读全文
posted @ 2020-02-16 22:26 程序员肥猫 阅读(287) 评论(0) 推荐(0)
摘要:ConcurrentHashMap 是`HashMap Hashtable 自旋+CAS ConcurrentHashMap`进行结构性修改时,只需要锁住修改元素所在的桶即可,其他不需要上锁同步,从而达到减小锁的粒度,资源竞争争抢降低,提供并发性能。 中键、值都不允许为null。 链表节点内部类 红 阅读全文
posted @ 2020-02-15 21:32 程序员肥猫 阅读(252) 评论(0) 推荐(0)
摘要:CountDownLatch 基于AQS实现的同步器,允许一个或者多个线程通过 方法进入阻塞等待,直到一个或者多个线程执行 完成。 在创建时需要传入一个 值,一旦某个或者多个线程调用了 方法,那么需要等待 值减为0,才能继续执行。 方法每执行一次,count(state)值减1,直到减为0。一个线程 阅读全文
posted @ 2020-02-01 10:52 程序员肥猫 阅读(337) 评论(0) 推荐(0)
摘要:CyclicBarrier 栅栏,与 类似,但不是基于AQS实现的同步器,用于多个线程之间等待。 每次使用完之后可以重置, 不可重置, 同步一组线程, 同步两组线程(一组调用 方法阻塞等待,另一组调用 唤醒阻塞线程)。 接收一个 对象,当线程全部到达(调用 ),执行 。 内部类Generation 阅读全文
posted @ 2020-02-01 10:47 程序员肥猫 阅读(328) 评论(1) 推荐(0)
摘要:Semaphore 信号量,许可,用于控制在一段时间内,可并发访问执行的线程数量,基于AQS实现。 获取许可,支持公平和非公平模式,默认非公平模式。公平模式无论是否有许可,都会判断是否线程在排队,如果有线程排队,获取线程立即失败,进入排队;非公平模式无论许可是否充足,直接尝试获取许可。 可用于网关限 阅读全文
posted @ 2020-02-01 10:45 程序员肥猫 阅读(387) 评论(0) 推荐(0)
摘要:ReentrantLock 可重入排他锁,基于AQS同步框架实现锁机制。可重入锁支持公平和非公平模式,默认使用非公平模式。 内部通过 中的内部类 可以实现条件等待,调用 、`Condition signal`的线程需要先获取到锁,否则将会抛出异常。 AQS实现 java abstract stati 阅读全文
posted @ 2020-02-01 10:43 程序员肥猫 阅读(187) 评论(0) 推荐(0)
摘要:AbstractQueuedSynchronizer 同步器,是JDK同步工具的基础框架,实现核心为对 属性进行自旋、CAS原子更新,内部存在两个队列——同步队列、条件队列(·Condition·)。同步队列:所有尝试获取锁的线程会在该队列上进行排队,排队时线程通过 方法阻塞,通过 唤醒;条件队列: 阅读全文
posted @ 2020-02-01 10:39 程序员肥猫 阅读(306) 评论(0) 推荐(0)
摘要:Unsafe 类是JDK底层类库提供的、基于Java内存模型访问底层的机制,通过该类可以实例化对象、直接操作堆外内存(直接内存)、CAS原子操作等。Java基于AQS实现的同步工具类、并发容器,Netty对堆外内存的操作都基于该类实现。 获取Unsafe实例 中提供了静态方法 可以直接获取到 对象, 阅读全文
posted @ 2020-01-29 19:21 程序员肥猫 阅读(249) 评论(0) 推荐(0)
摘要:ArrayDeque 是基于数组实现到的一个无界双端队列,容量可扩展,不允许null元素,因为移除位的元素将使用null填充。队列的容量是数组的长度,并且数组长度始终是2的次幂。使用 实现栈或者队列比使用 、`LinkedList`效率高。 双端队列可以从头部和尾部新增或移除元素。使用 和`tail 阅读全文
posted @ 2020-01-28 20:48 程序员肥猫 阅读(329) 评论(0) 推荐(0)
摘要:PriorityQueue 基于 实现,是一个无界队列,不允许null元素。底层存储使用数组,索引n的元素的左右两个孩子索引分别为 和 。 元素通过比较器排序,如果比较器为空,则使用自然排序。 默认容量大小为11,当存储数组中总元素个数等于数组长度时,触发扩容。扩容时,如果原存储数组长度小于64,则 阅读全文
posted @ 2020-01-28 16:02 程序员肥猫 阅读(436) 评论(0) 推荐(0)
摘要:HashMap 元素顺序:HashMap中元素是乱序的,并不会按照某种规律排序。在添加元素时新元素被插入到最后,扩容时,最后一个元素又被放置在桶的第一个元素。 默认容量为16,负载因子为0.75,扩容时,容量会x2扩大,扩容阈值也x2。 元素以一个数组为桶作为存储,数组的每一个索引位便是一个桶,桶中 阅读全文
posted @ 2020-01-27 16:08 程序员肥猫 阅读(161) 评论(0) 推荐(0)
摘要:UML || | | | | |add(E e)|添加在尾部| |remove(Object o)|找到并移除| |addFirst(E e)|头部添加一个元素| |removeFirst()|头部移除一个元素,如果链表为空,抛出异常| |addLast(E e)| 尾部添加一个元素| |remov 阅读全文
posted @ 2019-07-28 18:32 程序员肥猫 阅读(133) 评论(0) 推荐(0)
摘要:UML 主要代码 ArrayList实现了List、RandomAccess、Cloneable、Serializable,继承了AbstractList。 为什么继承了AbstractList还要实现List接口? AbstractList中已经实现了List接口,这里其实是没有必要再实现List 阅读全文
posted @ 2019-07-13 22:08 程序员肥猫 阅读(206) 评论(0) 推荐(0)