自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 JUC集合 ConcurrentHashMap原理,通过源码学习进行深入了解

概述ConcurrentHashMap 是在 HashMap 的基础上进行改进的线程安全 Map 类,在开始 ConcurrentHashMap 前,务必提前了解 HashMap 的原理和基本思想。ConcurrentHashMap 中使用 synchronized 进行锁定,主要用在 put 、remove操作以及扩容操作中,而且每一次锁住的只有当前的桶(数组的单个槽位)。ConcurrentHashMap 和 Hashtable 对象的 key、value 值不可为 null,而 HashMap

2020-07-25 12:54:07 344 1

原创 JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解2

学习本篇,你需要先学习文章JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解1概述前文介绍了AQS的基本原理,以及不同模式的acquire 如何在阻塞时加入到同步队列,以及维护同步队列的过程。而AQS的独占模式中,还实现了条件等待,即condition,await,signal,signalAll等重要的操作。condition等待队列如下:接下来要分析的就是AQS的内部类ConditionObject,通过源码分析它是如何实现等待和唤醒操作的。ConditionObject内部

2020-07-20 16:59:46 253

原创 JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解1

概述AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。AQS核心思想AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资

2020-07-20 14:53:19 234

原创 HashMap原理,通过源码学习进行深入了解

jdk1.8 HashMap学习(包括分析部分源码)概述底层结构为什么使用这个结构静态变量成员变量构造函数关键内部类Node 类TreeNode关键成员方法概述HashMap是java集合类中很常用的一个数据结构,它是非常典型的,用于存储(key,value)形式的键值对映射。HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变它的继承关系图如下:底层结构可以说HashMap本质上

2020-06-08 21:25:52 395

原创 JUC 线程池 ThreadPoolExecutor原理学习

概述ThreadPoolExecutor,从该类的命名也可以看出,这是一种线程池执行器。当有任务需要执行时,线程池会给该任务分配线程,如果当前没有可用线程,一般会将任务放进一个队列中,当有线程可用时,再从队列中取出任务并执行,如下图:线程池的引入主要为了解决以下问题:方便管理: 由线程池创建、调度、监控和销毁所有线程,能够控制线程数量,避免出现线程泄漏。降低资源消耗:重复利用已经创建的线程执行任务,而不是持续不断地创建和销毁线程,减少了系统因为频繁创建和销毁线程所带来的性能开销。提高响应速度:

2020-07-30 18:36:46 253

原创 JUC同步器 CountDownLatch原理学习

CountDownLatch主线程等待固定数量的其他线程运行完成之后,继续执行后面的操作。内部类 Sync同步控制器 Sync 类中实现获取共享锁的 tryAcquireShared 方法和释放共享锁的 tryReleaseShared 方法。此处的 Sync 不是抽象类。tryAcquireShared 方法中仅仅判断当前状态(状态用于判断是否打开 latch)是否等于 0,当状态值降为 0 时,打开 latch,线程可以获取到锁,否则阻塞在 latch 之外。在 tryReleaseShare

2020-07-28 22:13:54 184

原创 JUC集合 ConcurrentSkipListMap源码学习

ConcurrentSkipListMap在 ConcurrentSkipListMap 之前,了解跳跃表的概念和基本操作是必要的,如果忽略跳跃表的实际结构直接阅读源码,难度较大。ConcurrentSkipListMap 中有以下两点值得注意的地方:所有全局变量的修改都必须使用 CAS 的方式,这是保证 ConcurrentSkipListMap 属于线程安全集合类的基础。但这是远远不够的,如果其他线程对当前正在进行的操作相关的变量进行了修改,那么之前获取到的值可能不再是现在最新的值了。为了解决

2020-07-28 21:34:59 266

原创 JUC集合ConcurrentLinkedQueue 无锁队列 学习

概述ConcurrentLinkedQueue 是非阻塞无界并发队列,主要利用 CAS 实现多线程环境下的并发安全,元素入队出队规则为 FIFO (first-in-first-out 先入先出) 。由于是完全基于无锁算法实现的,所以当出现多个线程同时进行修改队列的操作(比如同时入队),很可能出现CAS修改失败的情况,那么失败的线程会进入下一次自旋,再尝试入队操作,直到成功。所以,在并发量适中的情况下,ConcurrentLinkedQueue一般具有较好的性能。成员变量此类中节点的组织形式为单向链

2020-07-26 12:46:02 360

原创 JUC集合 CopyOnWriteArrayList 写时复制数组,源码学习

概述CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现的。COW模式的体现。成员变量lock :用于修改性操作时需要加的重入锁。array:是底层存放元素的数组,在多线程操作下,其引用经常变化。 /** 保护所有数据更改操作的锁 */ final transient ReentrantLock lock = new ReentrantLock(); /** 数组。

2020-07-25 18:35:44 212

原创 JUC锁 Locks中的ReentrantReadWriteLock,读写锁原理,通过源码进行学习深入了解

概述ReentrantReadWriteLock 是 ReadWriteLock 接口的具体实现。和 ReentrantLock 一样,它使用 Sync (继承自 AQS 抽象类)作为锁的同步器,支持公平同步器和非公平同步器,分别在 FairSync 和 NonfairSync 中实现。在 AQS 同步器的基础上,此 Lock 实现了两种类型的锁,并把它们作为内部属性。这两种锁分别是读锁(共享锁) ReadLock 和 写锁(独占锁,排他锁)WriteLock。ReentrantReadWriteLo

2020-07-22 21:30:24 213

原创 JUC ThreadLocal原理,通过源码进行学习深入了解

概述变量值的共享可以使用public static 变量的形式实现,所有的线程都是用同一个public static变量,那如何实现每一个线程都有自己的变量呢,jdk提供的ThreadLocal就是用于解决这样的问题。ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线程都可以通过其 get 或 set方法来访问自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,

2020-07-21 22:53:41 172

原创 JUC锁 Locks中的ReentrantLock,可重入锁原理,通过源码进行学习深入了解

概述ReentrantLock实现了一个可重入、可中断、可选择公平或非公平竞争的独占模式的锁。该类实现了lock接口,内部使用了一个同步器sync来维护同步状态、阻塞/唤醒线程、管理等待队列等。而这个同步器就是基于AbstractQueuedSynchronizer来实现的。内部类ReentrantLock总共有三个内部类,并且三个内部类是紧密相关的,下面先看三个类的关系。  这三个类中,最底层都是基于AQS实现,其中Sync中将NonfairSync和FairSync两个类都会用到的方法抽取

2020-07-20 23:27:56 168

原创 java集合 LinkedHashMap原理, 通过源码学习进行深入了解

概述LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。所以,要看懂 LinkedHashMap 的源码,需要先看懂 HashMap 的源码。关于 HashMap 的源码分析参考:Ha

2020-07-17 00:17:49 151

原创 java集合 PriorityQueue原理, 通过源码学习进行深入了解

PriorityQueue基于jdk8源码学习概述原理继承关系成员变量构造函数扩容关键方法siftDown 和 siftUpheapify 和 removeAtadd 和 offerelement 和 peekremove 和 pollPriorityQueue 小结参考:概述一个基于优先级堆的无界优先级队列。根据 Comparable 比较器的自然顺序确定优先级元素的排列顺序,或者根据构造队列时创建的 Comparator 比较器排列队列元素。优先级队列不允许 null 元素。依赖于自然顺序的优先级队

2020-07-16 15:52:36 371

原创 java集合 ArrayDeque原理, 通过源码学习进行深入了解

ArrayDeque 基于jdk8源码学习概述继承关系成员变量构造函数关键成员方法扩容方法Deque中的方法12种双端队列的方法removeFirstOccurrence 和 removeLastOccurrence集合中方法size方法 和 isEmpty方法contains方法remove和cleartoArray方法clone 方法概述ArrayDeque是Deque接口的大小可调整数组的实现。ArrayDeque 没有严格的容量限制;可以根据需要增长。它不是线程安全的类,在缺乏外部同步的情况下,

2020-07-14 23:19:08 353 2

原创 java集合 LinkedList原理, 通过源码学习进行深入了解

LinkedList 基于源码学习概述继承关系成员变量内部节点类构造函数成员方法内部工具类方法linkFirst、linkLast、linkBefore 方法unlinkFirst、unlinkLast、unlink 方法node方法检查索引合法性的方法Deque相关方法单向队列方法栈的方法双端队列方法List相关方法add方法addAll方法get方法set方法remove方法size方法contain方法clear方法clone方法toArray方法LinkedList 小结ArrayList 和 Li

2020-07-13 17:58:26 249

原创 java集合 ArrayList 原理,通过源码学习进行深入了解

ArrayList 基于jdk8源码学习概述继承关系成员变量构造函数关键成员方法add方法扩容方法addAll方法get方法set 方法remove方法removeAll 和 retailAllclear方法其他成员方法size方法isEmpty方法contains方法indexOf方法lastIndexOf方法clone方法toArray方法ArrayList 小结ArrayList 的一些对比与数组的比较与LinkList、Vector对比区别概述ArrayList 是变长集合类,基于定长数组实现。

2020-07-10 18:20:51 261

原创 Java虚拟机 垃圾回收机制(GC区域、垃圾回收算法、垃圾收集器)

本文主要总结自《深入理解Java虚拟机》一书。主要是对java虚拟机GC哪些内存区域以及如何回收等内容作出整理。JVM垃圾回收机制概述GC回收的区域如何判断对象已死java堆引用计数算法可达性分析算法java中的引用类型方法区(类回收条件)什么时候进行回收垃圾收集算法标记-清除算法标记-复制算法标记-整理算法分代收集算法对象分配位置、创建对象的过程经典的垃圾收集器Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old收集器CMS(Co

2020-06-24 21:23:20 389

原创 Java虚拟机 JVM类加载机制(类加载过程、时机、双亲委派模型)

JVM 类加机制什么是类加载类加载的过程(类的生命周期)什么时候进行类加载加载验证准备解析初始化类加载器双亲委派模型什么是类加载java平台实现了一次编译到处运行,离不开JVM的帮助,当我们的程序经过编译器编译,它会形成一个个.class后缀的文件,java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转码解析和初始化,最终形成可以被虚拟机直接使用的JAVA类型,这个过程被称为虚拟机的类加载机制。一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在

2020-06-23 19:23:10 470 1

原创 java虚拟机简介,JVM运行时数据区域(jvm内存模型)

java虚拟机 JVM(java virtual machine什么是JVM(简单介绍一下JVM)jvm运行时数据区域程序计数器(Program Counter Register)虚拟机栈(VM Stack)本地方法栈(Native Method Stack)Java堆(Heap)方法区(Method Area)运行时常量池直接内存(非虚拟机运行数据区)什么是JVM(简单介绍一下JVM)虚拟机指的是抽象化的计算机,通过运行在实际计算机上来仿真模拟各种计算功能,而java虚拟机也是如此,它有自己完善的硬体

2020-06-15 21:01:39 340

空空如也

空空如也

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

TA关注的人

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