Java
文章平均质量分 86
huangsky001
这个作者很懒,什么都没留下…
展开
-
jvm垃圾回收机制原理读书笔记
可达性分析主要是用来解决哪些对象是不可用的,可以被回收。以一系列称为GC Roots的对象为起点,若对象到GC Roots之间没有任何引用关系,则认为该对象是不可用的,可以被回收.具体可作为GC Roots的对象如下(不是全部):**所有Java线程中当前栈帧的引用(例如局部变量),也就是活着的线程,**这个就是我们通常意义上Java代码new一个对象引用,这个对象引用所在的地方.所有ClassLoader所有全局变量对于classloader和全局变量,因为其一定伴随着应用的整个生命原创 2021-05-11 23:02:02 · 133 阅读 · 0 评论 -
jvm内存区域划分介绍
Java内存划分主要分为以下几块:程序计数器线程私有,可以看做是当前线程所执行的字节码的行号,用于下一次线程切换的时候虚拟机定位到上一次执行的位置。虚拟机栈线程私有,生命周期与线程相同。描述的是方法执行的内存模型。进入方法时对应入栈,方法结束的时候对应出栈。该区域存储着局部变量,操作数,方法出口等信息。方法区线程共享。主要用来存储类的元信息。 在1.7和1.8之后的实现逻辑有所不同。由于该区域大小一般较小,一般不会对该区域进行垃圾回收。所以在1.7之前的版本,有可能会因为字原创 2021-05-09 17:18:11 · 185 阅读 · 0 评论 -
队列同步器AQS原理分析及具体实现
Java中的并发编程很多都是以队列同步器AbstractQueuedSynchronizer为基础的, 例如ReentrantLock,CountDownLatch等。下面介绍其构成以及相应的实现。构成private volatile int state;AbstractQueuedSynchronizer中通过一个int类型的成员变量state来表示同步状态,该变量使用volatile来修饰,保证多线程之间的可见性。以及一个内置的队列来完成资源排队。其中对于state有如下几个操作方法:g原创 2021-04-08 23:16:46 · 203 阅读 · 0 评论 -
Java线程状态流转及部分函数说明
下面这张是Java线程状态改变的图例。下面就其中几点和函数进行说明运行态Java将操作系统中的"运行中running"和"就绪ready"两种状态统称为运行态runnable。runing和ready的切换由操作系统进行调度。join让当前线程等待join线程执行完毕。如果join()方法在一个线程实例上调用,则当前运行着的线程将阻塞直到这个线程实例执行完毕。该方法可以实现一个线程在另一个线程结束后再执行。public class JoinTest { public static原创 2021-04-01 21:52:42 · 217 阅读 · 1 评论 -
synchronized锁介绍
本文主要介绍synchronized的锁实现。锁的存储Java中的每一个对象都可以作为锁。synchronized关键字分为如下三种场景:修饰普通方法时,锁住的是调用该方法的对象实例修饰静态方法时,锁住的死当前类的Class对象修饰代码块时,锁住的是括号里的配置的对象Java对象头内部有一个Mark Word,存储着对象的hashcode、分代年龄、持有偏向锁的线程ID,锁标志位等信息。锁信息就存储在对象头。锁的分类锁按照级别从低到高依次是: 无锁 -> 偏向锁 -> 轻量级原创 2021-03-28 15:50:36 · 117 阅读 · 0 评论 -
HashMap源码分析
基本原理HashMap的数据结构是由数组和链表(或者树)组成。当进行元素的增删改查时,首先要定位到元素所在桶的位置,也就是table数组的下标,之后再从链表或树中定位该元素。定位下标使用 (n - 1) & hash 算法,其中n为数组长度,hash为key的哈希值hashmap是通过一个数组Node<K,V>[] table(该变量是一个类变量)存储所有的数据,每个元素存放元素的下标为putVal()函数中对应的局部变量p,其计算方法为:p = tab[i = (n - 1)原创 2021-03-24 18:19:20 · 71 阅读 · 0 评论 -
HashMap源码分析
基本原理HashMap的数据结构是由数组和链表(或者树)组成。当进行元素的增删改查时,首先要定位到元素所在桶的位置,也就是table数组的下标,之后再从链表或树中定位该元素。定位下标使用 (n - 1) & hash 算法,其中n为数组长度,hash为key的哈希值hashmap是通过一个数组Node<K,V>[] table(该变量是一个类变量)存储所有的数据,每个元素存放元素的下标为putVal()函数中对应的局部变量p,其计算方法为:p = tab[i = (n - 1)原创 2021-03-24 14:59:00 · 53 阅读 · 0 评论 -
一致性哈希算法
先弄懂几个概念哈希函数将任意长度的数据映射到有限长度的域上。就是对一段数据m进行杂糅,然后输出另一段固定长度的数据h,作为这段数据的特征值。其基本原理就是将数据块m分成多段,每一段长度固定(如128位),若某段长度不足,则进行补位(如0或者1),然后对每一块都进行hash运算,再将这些数据进行迭代(比如相邻两段进行异或),最终得到一个数据。JDK中HashMap的hash算法如下:JDK中String的hashCode算法如下:JDK中Integer的hashCode算法如下:JDK中Floa原创 2021-02-11 23:20:31 · 104 阅读 · 0 评论 -
mysql事务详解
以下的分析和总结都是针对InnoDb引擎.事务的四大特性这四个特性并不是平级的关系. 准确的说, 一致性是最基本的属性, 其他的属性都是为了保证一致性而存在的Atomicity 原子性原子性是指整个事务是一个整体,不可分割的最小工作单位。一个事务中的所有操作要么全部执行成功,要么全部都不执行。其中任何一条语句执行失败,都会导致事务回滚。Consistency 一致性指数据库的记录总是从一个一致性状态转变成另一个一致性状态。这里的一致性是语义上的一致性, 并不是语法上的一致性.比如经典的银行原创 2021-02-04 09:04:40 · 594 阅读 · 0 评论 -
线程池详解
构造参数线程池ThreadPoolExecutor的部分构造参数说明:corePoolSIze: 核心线程数目runnableTaskQueue: 阻塞队列,保存等待执行的任务。有以下几种类型:ArrayBlockingQuque: 基于数组实现的有界阻塞队列, 队列大小由构造函数指定LinkedBlockingQueue: 基于链表实现的无界阻塞队列,吞吐量通常高于ArrayBlockingQuque(没验证)SynchronousQueue: 不存储元素的阻塞队列。 该队列挺有意思, 有原创 2021-01-24 22:32:44 · 927 阅读 · 0 评论