自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HashMap源码解读,扩容操作

在JDK8中HashMap,是由 数组+链表+红黑树 组成的数组结构:transient Node<K,V>[] table;链表结构: HashMap<String, Double> hashmap = new HashMap<>(); map.put("k1",0.1); map.put("k2",0.2); map.put("k3",0.3); map.put("k4",0.4);构造函数:向has

2021-08-25 21:10:46 818 3

原创 SpringBoot是如何实现自动配置的?

SpringBoot启动类:@SpringBootApplicationpublic class CommunityApplication { public static void main(String[] args) { SpringApplication.run(CommunityApplication.class, args); }}进入@SpringBootApplication源码中:AutoConfigurationImportSelector 类的作用就是往 Spr

2021-08-24 22:03:04 2367 10

原创 SpringMVC工作原理及源码解析

SpringMVC工作原理及源码解析一:SpringMVC原理图二:SpringMVC的主要组件1、前端控制器DispatcherServlet:2、处理器映射器HandlerMapping:3、处理器适配器HandlerAdapter:4、处理器Handler:5、控制器Controller:6、视图解析器ViewResolver:7、视图View三:Spring MVC的工作流程四:Spring 如何保证 Controller 并发的安全?1、SpringMVC一个Controller处理所有用户请求的

2021-08-21 09:37:09 1267

原创 MyBatis的源码解析和运行原理、及常见面试题

MyBatis的解析和运行原理一:MyBatis是什么?二:ORM是什么三:为什么说Mybatis是半自动ORM映射工具?四:MyBatis编程步骤是什么样的?五:请说说MyBatis的工作原理六:MyBatis的功能架构七:MyBatis数据源与连接池1、MyBatis数据源DataSource分类2、数据源DataSource的创建过程3、DataSource什么时候创建Connection对象4、使用了连接池的PooledDataSource5、Connection对象的回收一:MyBatis是什么

2021-08-20 20:02:32 377

原创 Kafka,构建TB级异步消息系统

Kafka,构建TB级异步消息系统一:阻塞队列二:Kafka三:Spring整合Kafka一:阻塞队列这个是Java自带的API,用于解决线程通信的问题①BlockingQueue接口解决线程通信的问题。阻塞方法:put、take。原理图:线程Thread-1从左边存入数据线程Thread-2从右边取出数据阻塞队列Blocking Queue就在中间形成一道缓冲区,从而良好的解决线程通信的问题。阻塞队列满足生产者消费者模式②生产者消费者模式生产者:产生数据的线程。消费者:使

2021-08-17 17:57:50 243

原创 Netty零拷贝机制

通过FileRegion包装的FileChannel.tranferTo实现文件传输,可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。netty中的零拷贝和操作系统中零拷贝有点不一样,操作系统实现零拷贝主要是在内核态的优化,netty完全是在用户状态实现零拷贝。操作系统的核心是内核,它不同于普通应用程序,所以为了保护内核的存储空间,操作系统将虚拟空间分为了两个部分:内核空间和用户空间。

2023-02-12 11:18:10 1335 1

原创 JVM 基础 - Java 垃圾回收机制

给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。

2023-02-03 10:50:20 1999

原创 JVM 基础 - Java 类加载机制

3、缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

2023-02-02 21:35:06 484

原创 JVM基础 - 类加载的过程

其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也称为动态绑定)。。

2023-02-02 18:06:52 271

原创 JVM 基础 - JVM 内存结构

永久代物理是堆的一部分,和新生代,老年代地址是连续的(受垃圾回收器管理),而元空间存在于本地内存(我们常说的堆外内存,不受垃圾回收器管理),这样就不受 JVM 限制了,也比较难发生OOM(都会有溢出异常),并没有规定如何去实现它,不同的厂商有不同的实现。本地方法栈和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。:主管 Java 程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

2023-02-01 16:17:15 1013

原创 HashMap原理分析

HashMap在JDK7中采用的基本存储结构都是数组+链表形式。它的底层维护一个Entry数组。它会根据计算的hashCode将对应的KV键值对存储到该数组中,一旦发生hashCode冲突,那么就会将该KV键值对放到对应的已有元素的后面, 此时便形成了一个链表式的存储结构。

2023-01-31 11:25:42 314

原创 队列同步器AQS的实现与分析——共享锁模式

在doAcquireShared(int arg)方法自旋过程中,如果当前节点的前驱节点为头节点时,尝试获取同步状态,如果返回值大于等于0,表示该次获取同步状态成功,调用setHeadAndPropagate()方法设置当前节点为头节点,并从自旋过程中退出。tryAcquireShared()方法是用来获取共享模式下的锁,对于tryAcquireShared()这个方法我们重点看一下他的返回值。当失败的时候返回的是负值,如果返回的是0表示获取共享模式成功但是它下一个节点的共享模式无法获取成功。

2023-01-27 21:35:07 482

原创 队列同步器AQS的实现与分析——独占锁模式

然后返回false,代表当前节点不需要挂起,因为pred指向了新的Node,需要重试外层的逻辑。在enq(final Node node)方法中,同步器通过 “死循环” 来保证节点的正确添加,在 “死循环” 中只有通过CAS将节点设置成尾节点之后,当前线程才能从该方法返回,否则,当前线程不断地尝试设置。节点进入同步队列之后,就进入了一个自旋的过程,每个节点(或者说每个线程)都在自省地观察,当条件满足,获取到了同步状态,就可以从这个自旋过程中退出,否则依旧留在这个自旋过程中(并会阻塞节点的线程)

2023-01-27 20:28:03 454

原创 ThreadLocal底层原理

ThreadLocal是一个创建线程局部变量的类,ThreadLocal中的变量只有当前自身线程可以访问,别的线程都访问不了。每一个线程都有一个对应的Thread对象,而Thread类有一个ThreadLocalMap类型变量(threadLocals)和一个内部类ThreadLocal。这个threadLocals的key就是ThreadLocal的引用,而value就是当前线程在key所对应的ThreadLocal中存储的值。

2023-01-17 23:12:11 709

原创 操作系统新考点

1、操作系统引导2、open系统调用打开文件的底层原理3、虚拟文件系统(VFS)4、文件系统的挂载

2022-10-16 19:52:13 493

原创 树与二叉树的转换

(2)加线:找到每一层结点在其上一层的父结点。如第三层中,E-F的父结点是B,G的父结点是C,H-I-J的父结点是D;在第二层中,B-C-D的父结点是A,将每一层的结点和其父结点相连。(1)逆旋转:把二叉树从左上到右下分为若干层。如A是一层,B-C-D是一层,E-F-G-H-I-J是一层,然后调整为水平方向。(每遇到左孩子则为一层)(2)抹线:对每个结点,除了其左孩子外,抹掉其与其余孩子之间的连线。(3)抹线:删除每一层结点之间的连接。(3)旋转:将树作适当的旋转即可。(1)加线:在兄弟之间加一连线。

2022-09-08 10:17:00 12857

原创 操作系统——内存管理(三)

操作系统——内存管理(三)六、虚拟存储器六、虚拟存储器

2022-05-02 12:30:47 837

原创 操作系统——内存管理(二)

存储器管理(二)四、非连续分配管理方式2、分段存储管理方式(1)分段(2)段表(3)地址变换机构五、分页与分段的区别1、信息共享四、非连续分配管理方式2、分段存储管理方式引入分段存储管理方式的目的,则主要是为了满足用户(程序员)在编程和使用上多方面的要求。(1)分段进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。由于各个分段是按照

2022-04-28 21:11:44 3830

原创 多线程与多进程的联系

多线程与多进程的联系一、进程二、线程三、进程和线程的关系四、并行和并发五、同步和异步一、进程考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停。聪明,这当然没问题,但这里有一个关键词:切换。

2022-04-28 11:51:27 347

原创 操作系统——处理机调度与死锁

处理机调度与死锁一:处理机调度的层次1、高级调度(作业调度)2、中级调度(内存调度)3、低级调度(进程调度/处理机调度)二:调度算法1、先来先服务(FCFS)2、短作业优先(SJF)一:处理机调度的层次1、高级调度(作业调度)按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它们获得竞争处理机的权利。高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高

2022-04-27 22:15:30 1154 1

原创 操作系统——进程的描述与控制

进程的描述与控制一:进程的描述1、进程的定义2、进程控制块PCB3、进程的状态二:进程控制三:进程同步四:信号量机制五:经典进程的同步问题1、生产者-消费者问题一:进程的描述1、进程的定义引入进程实体的概念后,可以把进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。注:严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。不过,除非题目专门考察二者区别,否则可以认为进程实体就是进程。因此我们也可以说"进程由程序段、数据段、PCB三部分组成"2、进程控制

2022-04-25 12:06:25 1166

原创 操作系统——内存管理(一)

操作系统——内存管理一:内存的基础知识一:程序的装入和链接二:连续分配存储管理方式1、单一连续分配2、固定分区分配3、动态分区分配1、动态分区分配中的数据结构2、动态分区分配算法一:内存的基础知识一:程序的装入和链接用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:(1)编译(2)链接(3)装入二:连续分配存储管理方式1、单一连续分配在单一连续分配方式中,内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相

2022-04-19 13:04:19 1200

原创 JUC下的原子类及源码实现

JUC下的原子类及源码实现一:原子类原子更新基本类型原子更新引用类型原子更新属性原子更新数组Striped64一:原子类Java从JDK 1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。在atomic包里一共提供了17个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新引用类型、原子更新属性、原子更新数组。atomic包里的类基本都是使用Unsafe实现的包装类,而Unsafe类提供

2022-01-27 10:25:15 625

原创 可重入锁ReentrantLock源码解读

ReentrantLock基于AQS,在并发编程中它可以实现公平锁和非公平锁来对共享资源进行同步。同时,和synchronized—样,ReentrantLock支持可重入。除此之外,ReentrantLock在调度上更灵活,支持更多丰富的功能。在Java SE 5 之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。Lock的意义在于提供了区别于synchronized的另一种具有更多广泛操作的同步方式。

2022-01-24 23:57:10 905

原创 队列同步器AQS的实现与分析——概述

队列同步器AQS源码解读)一:队列同步器AQS(AbstractQueuedSynchronizer)1、AQS成员变量:2、FIFO等待队列:3、Node成员变量:4、tryAcquire()方法5、Acquire()方法6、addWaiter()方法7、acquireQueued()方法8、tryRelease()、release()方法一:队列同步器AQS(AbstractQueuedSynchronizer)首先膜拜一下大神Doug Lea队列同步器 AbstractQueuedSynchr

2022-01-23 23:34:40 651

原创 JVM类的加载机制

类的加载机制一:类加载的过程1.加载2.验证3.准备4.解析5.初始化二:类加载器类和类加载器双亲委派模型一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三个部分统称为连接。一:类加载的过程1.加载在加载阶段,Java虚拟机需要完成以下三件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的jav

2022-01-21 16:58:46 849

原创 JVM垃圾回收机制

JVM垃圾回收机制一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器1.G1(Garbage First)一:回收堆内存1.如何判定对象已死(可达性分析算法)当前主流的商用程序语言的内存管理子系统,都是通过可达性分析算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用

2022-01-20 20:23:45 6370 2

原创 synchronized实现原理——悲观锁机制

线程通过CAS去尝试获取锁,一旦获得,那么将会复制该对象的Mark Word到虚拟机栈的Lock Record中,并且将Lock Record中的Owner指针指向该对象锁。这时,这个对象被锁定了,获取了这个对象锁的线程就可以去执行一些任务。其实很简单,在Mark Word中,当锁标志位是01,那么判断倒数第三个bit是否为1,如果是1,代表当前对象的锁状态为偏向锁,于是再去读Mark Word的前23个bit,这23个bit就是线程ID,通过线程ID来确认想要获得对象锁的线程是不是"被偏爱的线程"。

2022-01-19 17:31:37 1089

原创 Redis内存淘汰策略、键过期策略

Redis内存淘汰策略、键过期策略一:内存淘汰策略二:键过期删除策略一:内存淘汰策略①volatile-LRU:从已设置过期时间的数据集中,淘汰最近最少使用的数据。②volatile-ttl:从已设置过期时间的数据集中,淘汰将要过期的数据。③volatile-Random:从已设置过期时间的数据集中,淘汰随机的数据。④allkeys-LRU:从所有的数据集中,淘汰最近最少使用的数据。⑤allkeys-Random:从所有的数据集中,淘汰随机的数据。⑥no-enviction:禁止驱逐数据。二

2022-01-14 15:53:50 267

原创 CAS原理——乐观锁机制

当预期值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行 CAS 操作。这个共享变量是obj对象的一个成员属性,valueOffset表示这个共享变量在obj类中的内存偏移量。很显然方法都是用native来修饰的,这就表明这个方法不是由Java来实现的。如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。,在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。

2022-01-12 11:14:05 876

原创 MySQL索引(InnoDB)

MySQL索引(InnoDB)一:数据在表中的组织存放方式索引组织表InnoDB逻辑存储结构二:索引的分类三:B+ 树索引聚集索引(聚簇索引)辅助索引四:B+ 树索引的使用索引选择联合索引覆盖索引五:哈希索引六:全文索引一:数据在表中的组织存放方式索引组织表在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。在InnoDB存储引擎表中,每张表都有个主键,如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:首先判断表中是否有非空的唯

2022-01-09 18:50:08 1003

原创 图解mysql事务实现原理

什么是redo log?redo log叫做重做日志,用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中。redo log 有什么作用?mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。

2022-01-06 17:56:19 652

原创 MySQL读写分离、MySQL锁机制

这里写目录标题一:MySQL读写分离二:MySQL锁三:分布式MySQL一:MySQL读写分离大型网站为了解决大量的并发访问,除了在网站实现分布式负载均衡之外还远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别是数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的连接,下面就进入我们今天的主题。利用主从数据库来实现读写分离,从而分担主数据库的压力。在多个服务器上部署mysql,将其中一台作为主数据库,

2022-01-03 22:33:20 1463

原创 Redis的六种底层数据结构

Redis中5种数据类型的底层数据结构Redis的五大数据类型1、Redis 键(key)2、Redis字符串(String)3、Redis列表(List)4、Redis集合(Set)5、Redis哈希(Hash)6、Redis有序集合Zset(sorted set)Redis的五大数据类型redis常见数据类型操作命令:http://redisdoc.com/简介1、Redis 键(key)2、Redis字符串(String)3、Redis列表(List)4、Redis集合(Set)5

2022-01-03 17:45:07 3416 2

原创 Netty 高性能架构设计

Netty 高性能架构设计一:传统阻塞 I/O 服务模型二:Reactor 模型1、单 Reactor 单线程2、3、三:Netty模型一:传统阻塞 I/O 服务模型二:Reactor 模型基于I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理Reactor对应的叫法:① 反应器模式 ② 分发者模式(Dispatcher) ③ 通知者模式(notifier)

2021-12-17 21:46:33 386

原创 计算机组成原理——CPU

计算机组成原理——CPU一:CPU模型二:指令周期1、时钟周期2、机器周期(CPU周期)3、指令周期一:CPU模型二:指令周期1、时钟周期时钟周期:时钟周期是CPU的基本时间计量单位,它是CPU一切操作的计时标准和基本控制信号,它由计算机的主频决定。T = 1 / f8086的主频为5MHZ,则一个时钟周期为200ns80486主频为100MHZ,则一个时钟周期为10ns2、机器周期(CPU周期)3、指令周期下面给出6条指令组成的一个程序,通过每一条指令的取指阶段和执行阶段的分解动作

2021-11-27 23:46:20 18056 5

原创 Vector的线程安全问题

首先提一个问题,Vector是线程安全的吗?很多人都会回答:vector是线程安全的。确实,通过查看JDK源码中,Vector确实是线程安全的,至少Vector的作者是这么说的。通过观察源码,发现 Vector 类中的大部分方法都是由 synchronized 关键字来修饰的,这也就保证了所有的对外接口都会以 Vector 对象为锁。访问 Vector 的任何方法都必须获得对象的 intrinsic lock (或叫 monitor lock ),所以在Vector内部,所有的方法都不会被多线

2021-11-04 16:39:10 7391

原创 计算机组成原理——指令系统

指令系统一:指令系统的发展与性能要求1、指令系统及其发展2、指令系统性能的要求3、常见的指令集二:指令格式1、指令字长度2、操作码一:指令系统的发展与性能要求1、指令系统及其发展一台计算机中所有机器指令的集合,称为这台计算机的指令系统(指令集)。指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅影响到机器的硬件结构,而且影响到系统软件。因为指令是设计一台计算机的硬件与低层软件的接口。2、指令系统性能的要求指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要

2021-11-04 15:13:35 20493 1

原创 线程安全的三大特性(原子性、可见性、有序性)、volatile关键字

volatile关键字介绍一:线程安全的三大特性1、原子性2、可见性3、有序性二:volatile关键字一:线程安全的三大特性1、原子性原子性是指操作是不可分的。其表现在于对于共享变量的某些操作,应该是不可分的,必须连续完成。比如 a++ 操作,实际上 JMM 会分 3 步来完成。①②③读取变量 xttblog 的值xttblog 的值+1将值赋予变量 xttblog这三个操作中任何一个操作过程中,xttblog 的值被人篡改,那么都会出现我们不希望出现的结果。所以我们必须保证这是原子性的

2021-10-31 11:40:38 6599 2

原创 计算机组成原理——存储器(二)

存储器(二)十一:Cache存储器1、 cache的基本原理2、 主存与cache的地址映射全相联映射方式(空位随意放)直接映射方式(对号入座)组相联映射方式(按号分组,组内随意放)3、Cache的替换策略4、Cache的写操作策略十二:虚拟存储器十一:Cache存储器Cache是介于CPU和主存之间的小容量存储器,存取速度比主存快。它能高速地向CPU提供指令和数据,加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。1、 cache的基本原理cache除包含SRAM,还

2021-10-28 19:18:55 4384

空空如也

空空如也

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

TA关注的人

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