12 2019 档案
摘要:ConcurrentHashMap 内部结构 在JDK1.8之前的实现结构是:ReentrantLock+Segment+HashEntry+链表 JDK1.8之后的实现结构是:synchronized+CAS+Node+链表或红黑树(与HashMap一致) 而1.8之前锁的是Segment,1.8
阅读全文
摘要:HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树。 put操作 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<
阅读全文
摘要:CountDownLatch 众所周知,它能解决一个任务必须在其他任务完成的情况下才能执行的问题,代码层面来说就是只有计数countDown到0的时候,await处的代码才能继续向下运行,例如: 运行结果: 源码 实际上内部十分简单,里面只有一个AQS的子类 下面看具体做了什么事情 先来看await
阅读全文
摘要:线程安全可以概括为三个方面:原子性、可见性和有序性。 原子性:对于涉及共享变量的操作看做一个整体,在同一时间内,只能由一个线程执行,在其它线程看来,这部分操作要么尚未开始,要么已经完成。Java中,基本类型除了long和double,其它类型变量的写操作都是原子性的。 可见性:一个线程修改了共享变量
阅读全文
摘要:LinkedTransferQueue 功能 全名 简述 基于链表的的无界队列。队列的头是某个生产者在队列中停留时间最长的元素。队列的尾部是某个生产者在队列中时间最短的元素。 注意,与大多数集合不同,size方法不是一个常量时间操作。由于这些队列的异步性,确定当前元素的数量需要遍历元素,因此如果在遍
阅读全文