- 博客(21)
- 收藏
- 关注
原创 SpringBoot启动过程
默认情况下SpringBoot提供了一个EventPublishingRunListener,它实现了SpringApplicationRunListener接口,默认情况下会利用EventPublishingRunListener发布一个ApplicationContextInitializedEvent事件,程序员可以通过定义ApplicationListener来消费这个事件。ApplicationListener是Spring中的监听器,并不是SpringBoot中的新概念,不多解释了。
2023-01-07 17:28:26
415
原创 InnoDB引擎底层事务的原理
阶段一:将记录的delete_mask标识位设置为1,这个阶段称之为。正常记录链表中的最后一条记录的delete_mask值被设置为1,但是并没有被加入到垃圾链表。也就是此时记录处于一个中间状态。在删除语句所在的事务提交之前,被删除的记录一直都处于这种所谓的中间状态。主要是为了实现MVCC的功能。版本链阶段二:当该删除语句所在的事务提交之后,会有专门的线程后来真正的把记录删除掉。所谓真正的删除就是把该记录从正常记录链表中移除,并且加入到垃圾链表的头节点。
2022-12-30 14:46:15
234
原创 InnoDB引擎底层原理
以记录为单位来向表中插入数据,这些记录在磁盘上的存放方式也被称为行格式或者记录格式。分别是和Compressed行格式。指定行格式:表名 (列的信息)行格式名称COMPACT变长字段长度列表:变长字段占用的字节数(比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型),超过255字节并且真实存储的字节数超过127字节,则使用2个字节,否则使用1个字节8byte 2的8次方NULL值列表:存储NULL值的列的列表,二进制位的值为1时。
2022-12-29 10:45:32
115
原创 Map面试题
首先,JDK8中是支持多线程扩容的,JDK8中的ConcurrentHashMap不再是分段,或者可以理解为每个桶为一段,在需要扩容时,首先会生成一个双倍大小的数组,生成完数组后,线程就会开始转移元素,在扩容的过程中,如果有其他线程在put,那么这个put线程会帮助去进行元素的转移,虽然叫转移,但是其实是基于原数组上的Node信息去生成一个新的Node的,也就是原数组上的Node不会消失,因为在扩容的过程中,如果有其他线程在get也是可以的。JDK8的HashMap是数组+链表+红黑树实现的。
2022-11-29 11:41:48
96
原创 线程池定义
参数含义核心线程大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使有其他空闲线程可以处理任务也会创新线程,等到工作的线程数大于核心线程数时就不会再创建了。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前把核心线程都创造好,并启动线程池允许创建的最大线程数。如果队列满了,且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。如果我们使用了无界队列,那么所有的任务会加入队列,这个参数就没有什么效果了线程池的工作线程空闲后,保持存活的时间。
2022-11-19 15:51:21
155
原创 ReentrantLock
Exclusive-独占,只有一个线程能执行,如ReentrantLockShare-共享,多个线程可以同时执行,如Semaphore/CountDownLatch同步等待队列:用于维护获取锁失败时入队的线程条件等待队列:调用await()方法回释放锁,然后线程会加入条件等待队列队尾,调用singal()唤醒的时候会把条件队列的线程节点移动到同步队列队尾,然后等待unlock解锁unpark同步等待队列的线程值为0,初始状态,表示当前节点在同步等待队列中,等待获取锁。
2022-11-13 10:32:59
181
原创 synchronized
一个程序运行多个线程本身是没有问题的,一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区,其共享资源为临界资源。
2022-11-11 20:53:43
250
原创 CAS&Atomic
基本类型引用类型:AtomicReference、AtomicStampedRerence(stamp是版本,每次修改可以通过+1保证版本唯一性,防止ABA问题)、AtomicMarkableReference(变量mark是boolean类型,仅记录值是否有过修改,防止ABA问题);数组类型对象属性原子修改器原子类型累加器(jdk1.8增加的类)
2022-11-02 20:09:08
114
原创 volatile
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。JMM描述的是一种抽象的概念,一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性、有序性、可见性展开的。
2022-10-31 00:24:34
182
原创 JVM常量池
Class常量池可以理解为是Class文件中的资源仓库。Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。
2022-10-19 22:40:34
402
2
原创 map在list循环里面赋值问题
查询回一个List<Map<String,Object>>集合,for循环里面遍历这个集合给新的list复制判断到特定的条件给这个list添加map结果,List集合中的所有当前map都被处理了,各种new对象,都未解决;问题原因是:指向问题:修改对象指向的是一个对象地址解决办法:循环list时,将对象每次都克隆一次,putAll();List<Map...
2019-01-24 15:25:43
5955
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人