JAVA
小凯Alex
这个作者很懒,什么都没留下…
展开
-
JDK源码阅读计划(Day16) j.u.c之Semaphore
注释阅读Semaphore是计数信号量,允许N个线程同时访问资源。然而Semaphore并不会创建相应的许可证object,它内部仅仅是维护一个计数量。acquire操作会阻塞线程,除非拿到许可证才能继续进行。release操作会添加许可证,让线程去竞争这个许可证。Semaphore默认计数为1,相当于一个二元信号量,可以当作Lock来使用。可以实现为公平和非公平模式继承关系/* * 信号量,适合多个线程一起工作,即在某个时间段,可以有多个线程同时持有锁(线程数量受许可证总量限制) *原创 2020-05-13 21:42:16 · 222 阅读 · 0 评论 -
JDK源码阅读计划(Day15) j.u.c 之 LockSupport
基于JDK11LockSupport我们参考啃透JAVA并发先跑一个demopublic static void main(String[] args) { Thread t = new Thread(()->{ LockSupport.park(); System.out.println("Start working"); }); //t线程开始运行 t.start();原创 2020-05-12 11:13:57 · 172 阅读 · 0 评论 -
JDK源码阅读计划(Day14&15) AQS
JDK11AQS若被请求的共享资源空闲,则会把当前请求资源的线程设置为有效的工作线程,并且把共享资源设置为锁定状态。如果被请求的共享资源被占用,就把线程封装为Node加入到一个虚拟队列中,具体是通过CLH队列锁的方式实现。JDK并发包中的CountDownLatch,ReentrantLock,ThreadPoolExecutor,Semaphore,ReentrantReadWriteLock 都是继承自AbstractQueuedSynchronizer这个抽象类,其本质使用一个双向链表维护一个原创 2020-05-10 22:14:05 · 207 阅读 · 0 评论 -
JDK源码阅读计划(Day13) ConcurrentSkipListMap & 跳表学习
跳表上图可以看到,一个有序单链表,查找某元素的平均时间复杂度为O(n)跳表本质上是在有序链表上建立多层索引,以实现二分查找。以空间换时间的思想,实现增删查改平均时间复杂度为O(lgn)而skipList的结构可能有2种:第一种是每个结点会指向向右和向下的结点,像ConcurrentSkipListMap就是这么设计的 /** * Index nodes represent the levels of the skip list. */ // 跳表索引,存储右侧跟下侧原创 2020-05-09 20:09:38 · 191 阅读 · 0 评论 -
JDK源码阅读计划(Day12) BitSet
JDK11BitMap原理&使用场景用一个bit来存放一个状态的容器。由于对内存占用少,适合用于处理大规模数据和数据状态不多的情况。毕竟一个bit只对应两个状态。图来自ref假设原来有个int数组[1,2,3,6,7]需要用5*32bit=160bit来保存存储空间。但如果把元素的值作为下标每个下标用一个bit来表示,如0表示不存在该元素,1表示存在。那么只需要在内存空间开辟一...原创 2020-05-08 14:40:22 · 205 阅读 · 0 评论 -
JDK源码阅读计划(Day11) LinkedHashMap
继承图如下LHM与HashMap/* * LinkedHashMap是有序Map,也是HashMap的子类,其基础结构与HashMap一致 * 这里有序的含义是说其遍历顺序与元素加入的顺序有关 * 该Map中的元素按其加入的顺序,维护一个双向链表,为其额外建立了前后链接 * * 普通情况下,LinkedHashMap的遍历操作中,元素顺序就是其加入到Map时的顺序 * acces...原创 2020-05-06 21:07:06 · 167 阅读 · 0 评论 -
JDK源码阅读计划(Day10) ConcurrentHashMap 扩容,计数部分
扩容Hash表的扩容一般分为:哈希数组的扩容一般是建立一个原来数组大小两倍的数组,通常由单线程完成数据迁移把旧数组中的各个槽的结点重新分配到新的table中。通常涉及到Key值的rehash而HashMap与ConcurrentHashMap并不会重新计算每个key的hash值,而是数组扩容后,新的索引要么在原idx,要么在idx+n(n为扩容前数组容量)这种处理方式的好处:方便多...原创 2020-05-05 21:44:44 · 250 阅读 · 0 评论 -
(CMU15-721) An Evaluation of Concurrency Control with One Thousand Cores 论文阅读笔记
摘要CPU核数的增多,给并发控制带来了巨大的压力。该论文实验环境为1024核,并且尝试了七种并发控制的方法,但都失败了。启示我们,面对多核芯片应该要重新设计数据库的架构导论现如今的CPU速度提升往往是靠增大核数,而不是提高单核的处理能力。那么对应的给数据库的并发控制带来了非常大的压力,性能的瓶颈在于多个线程之间的竞争与调度。本文的主要贡献:对于7种并发控制策略扩展性的讨论第一篇在...原创 2020-05-03 17:13:36 · 2409 阅读 · 2 评论 -
JDK源码阅读计划(Day9) ConcurrentHashMap 非扩容,计数部分
JDK11我们可以看到ConcurrentHashMap实现了ConcurrentMap,Serializable这两个接口并且继承了AbstractMap这个抽象类。实现与提供的操作和HashMap类似,都是哈希数组+链表/红黑树,但是key和value不能为null,并且是线程安全的,然而又不像HashTable用synchroinze锁表来保证线程安全,那样做的话效率太低了。重要成员...原创 2020-05-03 15:10:44 · 199 阅读 · 0 评论 -
JDK源码阅读计划(Day8) HashMap 红黑树部分
红黑树打开尘封已久的算法导论,好好翻开第13章…红黑树的性质是一种二叉搜索树,可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lg n)每个节点增加一个用于表示颜色的存储位红黑树能确保没有一条路径会比其他路径长2倍每个节点属性: color,key,left,right,parent如果结点没有子节点或者父节点,指针可以设为NULL根节点和叶节点是黑色的对于每个节点,从该...原创 2020-05-01 21:52:11 · 192 阅读 · 0 评论 -
JDK源码阅读计划(Day7&8) HashMap 非红黑树部分
JDK11版本今天看到篇文章如何阅读JDK源码,受益良多今后读源码应该带着问题来读,而不是为了读而读!思考问题既要横向比较(HashMap,ConcurrentHashMap或者其他map之间的区别),也要纵向比较(不同JDK版本的HashMap有什么变化)先提出几个面试经常提到的问题,再带着问题来阅读:1.HashMap是线程安全的吗?如果不是,不安全体现在哪里?2.HashMap的...原创 2020-04-30 20:00:37 · 217 阅读 · 0 评论 -
JDK源码阅读计划(Day6) AbstractMap & AbstractSet
JDK11AbstractMappublic abstract class AbstractMap<K,V> implements Map<K,V> {Map的抽象类实现,那有哪些Map继承了这个抽象类呢?EnumMapHashMapIdentityHashMapLinkedHashMapWeakHashMapTreeMap未来一周的计划就是把这些...原创 2020-04-29 18:39:51 · 169 阅读 · 0 评论 -
JDK源码阅读计划(Day4) Collection,List,AbstractCollection & AbstractList
JDK11Collection接口public interface Collection<E> extends Iterable<E> {作为一元容器的顶级接口,实现类包括线性表(List,Queue,Stack)和集合(Set)List能够包含重复的元素,Set包含的是不重复元素Bags和multisets可以直接实现该接口Set和List子接口继承了Co...原创 2020-04-27 15:42:57 · 175 阅读 · 0 评论 -
JDK源码阅读计划[Day3] AbstractStringBuilder,StringBuffer,StringBuilder
JDK11代码参考的是 https://github.com/kangjianwei/LearningJDK/blob/master/src/java/lang/String.javaAbstractStringBuilder这个类方法挺多的,1700多行,只挑一些重要而且陌生的记录下/** * A mutable sequence of characters. * <p>...原创 2020-04-26 15:11:28 · 171 阅读 · 0 评论 -
JDK源码阅读计划(Day2) String类
JDK11代码参考这位大佬的阅读笔记:https://github.com/kangjianwei/LearningJDK/blob/master/src/java/lang/String.java我们慢慢来String实现了三个接口实现 Serializable 接口,可序列化实现 Comparable 接口,可比较大小实现 CharSequence 接口,StringBuffer...原创 2020-04-24 19:16:41 · 172 阅读 · 0 评论 -
JDK源码阅读计划(Day1) Object类
JDK8源码阅读计划(一) Object类/** * Class {@code Object} is the root of the class hierarchy. * Every class has {@code Object} as a superclass. All objects, * including arrays, implement the methods of this...原创 2020-04-24 14:25:37 · 170 阅读 · 0 评论 -
深入理解Java虚拟机第三版——虚拟机类加载与字节码执行机制
Chapter6 类文件结构无关性的基石Java"一次编写,到处运行"是怎么做到的呢?Java代码编译后的结果是从本地机器码转变为字节码。Java虚拟机不与某种特定语言绑定,而是和".class"文件绑定,Class文件中包含了Java虚拟机指令集,符号表等。因此,JVM不需要关心字节码的源语言。什么是.class是一组以8个字节为基础单位的二进制字节流。文件格式如下:magic[...原创 2020-02-01 15:43:16 · 608 阅读 · 0 评论 -
深入了解JAVA虚拟机——垃圾收集器与内存分配策略
首先java虚拟的堆存放着所有的对象实例,那么在进行垃圾回收的时候,如何确定有哪些对象还活着?哪些已经死去了?引用计数算法给对象添加一个引用计数器,每当有一个对象引用它的时候,计数器加一,失效的话计数器减一,任何时候计数器为0的对象都不能再被使用。但是难以解决对象间循环引用的问题。根搜索算法通过一系列名为"GC Roots"的对象作为起始点,从这些节点由上往下搜索,搜索所走过的路径称...原创 2019-12-01 11:56:59 · 120 阅读 · 0 评论 -
Java8实战Chap4&5流处理
Stream可以看做是遍历数据集的高级迭代器。先定义一个DISH类,任务是要求返回低热量的菜的名称。(卡路里<400)package lambdasinaction.chap4;import java.util.*;public class Dish { private final String name; private final boolean veget...原创 2019-08-10 15:47:44 · 150 阅读 · 0 评论 -
深入了解JAVA虚拟机读书笔记(一) JAVA内存区域与内存溢出异常
内存划分JAVA虚拟机会在执行java程序过程中把其管理的内存划分为若干个不同的数据区域。为什么方法区和堆是所有线程共享的?而为什么程序计数器,栈是线程隔离的?程序计数器实质:一块小的内存空间作用:当前线程执行的字节码的行号指示器,决定下一条执行的指令由于多线程是通过线程轮流切换并且分配处理器执行时间来实现的,任何时刻一个处理器只会执行一条线程的指令,因此为了线程切换后能够恢复到正确...原创 2019-08-25 17:05:16 · 110 阅读 · 0 评论 -
JAVA 线程池的使用&源码解读
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler hand...原创 2019-09-07 00:26:26 · 295 阅读 · 1 评论 -
Java并发编程实战 线程安全性
线程安全性定义多个线程访问某一个类的时候,不管运行环境采用的调度方式或者线程将如何交替进行,并且在代码中不需要进行任何额外的同步或者协同,这个类都能表现出正确的行为,那么这个类就是线程安全的.原子性 & 加锁机制Java提供了Synchronized Block这一内置锁机制来支持原子性.synchronized (lock) {}进入代码块后自动获得锁,退出代码块后自动...原创 2019-09-14 15:09:58 · 142 阅读 · 0 评论 -
史诗级巨坑记录——使用log4j打日志但是第三方包默认的log4j.properties覆盖了resources下的lof4j.properties
假设某Spring项目,你要用log4j来打日志,确发现日志死活在本地文件生成不出来??这个时候你可以在运行java程序的时候,加上-Dlog4j.debug的虚拟机参数,看看默认的log4j.properties在哪里log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClas...原创 2019-09-23 11:42:33 · 1752 阅读 · 0 评论 -
JAVA8实战第2&3章读书笔记
通过行为参数化来传递代码#### example:假如说你要编写一个筛选绿苹果的函数,你可能会这么写:import java.util.ArrayList;import java.util.List;public class test { public static List<apple> filter(List<apple> inventory){ ...原创 2019-07-28 11:28:44 · 280 阅读 · 0 评论