- 博客(22)
- 收藏
- 关注
原创 JUC并发工具类应用场景
解决多线程竞争资源的问题,例如多个线程同时对同一个数据库进行写操作,可以使用ReentrantLock保证每次只有一个线程能够写入。实现多线程任务的顺序执行,例如在一个线程执行完某个任务后,再让另一个线程执行任务。实现多线程等待/通知机制,例如在某个线程执行完某个任务后,通知其他线程继续执行任务。
2023-07-29 13:19:06
96
原创 并发安全问题
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。如何实现呢?
2023-07-26 23:23:22
117
原创 CAS&Atomic原子操作详解
什么是原子性?相信很多同学在工作中经常使用事务,事务的一大特性就是原子性(事务具有ACID四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作A和B都包含多个步骤,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,执行B的线程看A的操作也是一样的,那么A和B对彼此来说是原子的。
2023-07-26 22:13:13
187
1
原创 导致 JVM 内存泄露的 ThreadLocal 详解
JVM利用设置ThreadLocalMap的Key为弱引用,来避免内存泄露。JVM利用调用remove、get、set方法的时候,回收弱引用。当ThreadLocal存储很多Key为null的Entry的时候,而不再去调用remove、get、set方法,那么将导致内存泄漏。使用线程池+ ThreadLocal时要小心,因为这种情况下,线程是一直在不断的重复运行的,从而也就造成了value可能造成累积的情况。
2023-07-23 21:50:21
165
1
原创 从 0 开始深入理解并发、线程与等 待通知机制
为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。由于最初多数的用户线程是被设计成协同式调度(Cooperative Scheduling)的,所以它有了一个别名——“协程”(Coroutine) 完整地做调用栈的保护、
2023-07-20 23:44:57
110
原创 JVM参数汇总
XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。-Xss:每个线程的栈大小,针对的是单个线程。默认15次,CMS默认6次。
2023-07-16 16:09:01
199
1
原创 常量池讲解
Class常量池可以理解为是Class文件中的资源仓库。Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是,用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。
2023-07-15 23:14:59
361
1
原创 垃圾收集器G1
G1 (Garbage-First)是一款面向服务器的垃圾收集器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.G1将Java堆划分为多个大小相等的独立区域(),JVM目标是不超过(JVM源码里TARGET_REGION_NUMBER 定义),实际可以超过该值,但是不推荐。一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数"-XX:G1HeapRegionSize"手动指定Region大小,但是推荐默认的计算方式。
2023-07-11 21:17:51
257
原创 垃圾收集器ParNew&CMS与底层三色标记算法详解
当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。
2023-07-09 21:01:01
123
1
原创 JVM对象创建与内存分配机制深度剖析
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。
2023-07-07 23:45:52
631
1
原创 JVM内存模型深度剖析与优化
a. Eden、Survivor From复制到SurvivorTo,年龄+1首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区,当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1。b. 清空eden-Survivor Erom。
2023-07-05 21:53:35
134
1
原创 从JDK源码级别彻底剖析JVM类加载机制
自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是loadClass(String, boolean),实现了。
2023-07-02 18:46:29
238
1
原创 MVCC多版本并发控制机制
MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。
2023-06-26 21:25:12
190
1
原创 Mysql锁机制与优化实践
MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete前操作会自动给涉及的表加写锁。InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。另外,读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
2023-06-26 20:38:22
118
1
原创 Mysql事务原理与优化最佳实践
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了,用一整套机制来解决多事务并发问题。接下来的,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
2023-06-24 22:43:10
181
1
原创 Explain详解与索引最佳实战
mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值。
2023-06-22 19:35:02
1040
1
原创 深入理解MySql索引底层数据结构
特点:左边的子节点比父节点小,右边的的子节点比父节点大为什么不使用二叉树为索引?如果 顺序排列的话 例如 数据自增select * from t where col1 = 6 ,变成一个链表了,树的高度太深。
2023-06-22 18:42:37
84
1
原创 Mysql索引优化实战一
MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。order by满足两种情况会使用Using index1)order by语句使用索引最左前列2) 使用where子句与order by子句条件列组合满足索引最左前列。尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最左前缀法则。如果order by的条件不在索引列上,就会产生Using filesort。
2023-06-22 18:23:59
132
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人