自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【JUC】第八章:共享模型之工具(线程池、ThreadLocal原理)

/ 1.死等// 2.带超时等待// 3.让调用者放弃任务执行// System.out.println("放弃");// 4.让调用者自己抛出异常// 5.让调用者自己运行任务task.run();i < 10;try {});// 任务队列// 锁// 生产者条件变量// 消费者条件变量// 添加元素try {// 首先看队列是否已满try {try {try {

2024-09-14 10:45:32 1165

原创 【JUC】同步器(AQS原理、ReentrantLock原理、ConcurrentHashMap原理)

AQS全称为AbstractQueuedSynchronizer(抽象队列同步器)。AQS是一个用来构建锁和其他同步组件的基础框架。使用AQS可以简单且高效地构造出应用广泛的同步器,例如ReentrantLock、Semaphore、ReentrantReadWriteLock和FutureTask等等。AbstractQueuedSynchronizer是一个用于构建锁和相关同步组件的基础框架。那我们来使用一下这个基础框架。我们定义一个类,来继承AQS这个类。

2024-09-08 15:32:31 1562

原创 手撕HashMap源码

终于通过不屑努力,把源码中的重要部分全都看完了,每一行代码都看明白了,还写了注释import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.*;import java.util.function.Consumer;import java.util.function.Function;public class MyHashMap<K, V> extends Ab

2024-09-06 21:10:48 240

原创 红黑树刨析(删除部分)

首先找到删除节点的后继节点,再将后继节点和删除节点替换,问题就变成删除替换节点的问题,而且替换节点要么无子树,要么有一个节点,问题就变回了情景1或者情景2。删除节点P之后,左右两边不平衡了,可以直接将父节节点变成黑色,兄弟节点变成红色,这样就平衡了。情景1.2.2.3.1:删除节点的兄弟节点是黑色,兄弟节点无孩子,父亲节点是红色。情景1.2.2.3.2:删除节点的兄弟节点是黑色,兄弟节点无孩子,父亲节点是黑色。将父亲节点和兄弟节点颜色互换,然后再将父亲节点左旋,此时这就变成了。

2024-08-30 20:38:20 1050

原创 红黑树刨析(插入部分)

那么解决方案就是:将父亲节点和叔叔节点改为黑色,爷爷节点改为红色,但爷爷节点可能是根节点,也可能爷爷的父亲也是红色节点,所以还需要对爷爷节点进行处理,直到平衡为止。节点变成了之前的爷爷节点,现在应该对新的x节点进行转换,它发现它的叔叔是黑色节点,那么首先将爷爷节点进行右旋,由于插入的节点是红色的,当插入节点的父节点是黑色的时候,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。插入的节点的颜色都是红色的,因为插入红色对树的影响较小,如果插入的是黑色节点,那么必须要左复杂的平衡操作。

2024-08-17 19:09:20 800

原创 【JUC】第五章:共享模型之内存

但是上面这样的代码是不够好的,如果我们已经创建好一个实例了,其他线程使用这个实例的时候还是会竞争锁,每个线程都要竞争锁,这样会严重影响性能,只要实例创建成功之后,其他线程应该直接拿到这个实例,不应该再去竞争锁。比如:a=1,b=a;d的,有序性的前提是,在synchronzied代码块中的共享变量,不会再代码块中使用到,否正有序性不能被保证,只能使用。每个线程都有自己独立的工作内存,里面保存着该线程使用到的变量的副本。当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。

2024-08-08 21:58:30 807

原创 【Redis】数据结构篇

Redis为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。

2024-08-08 21:53:48 801

原创 【JVM】第三章:类加载与字节码技术

而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。如果程序运行的全部代码(包括自己编写的、第三方包中的、从外部加载的、动态生成的等所有代码)都已经被反复使用和验证过,在生产环境的实施阶段就可以关闭大部分的类验证措施,以缩短虚拟机类加载的时间。双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java 的核心 API 不被篡改。

2023-12-31 21:48:44 1130 1

原创 第二章:垃圾回收

垃圾回收

2023-12-19 20:03:25 319

原创 【JVM】第一章:内存结构

在 JDK 7 及之前的版本,字符串池是通过 PermGen(永久代)来实现的,而在 JDK 8 及之后的版本,随着永久代的移除,字符串池被移到了堆中的一部分,具体说是放在了 Metaspace(元数据区)。当Java程序中遇到字符串字面量时,JVM会首先检查字符串池,如果字符串已经存在与池中,就直接返回池中的引用,而不会创建新的对象。如果在程序的其他地方创建相同内容的字符串穿常量,Java会检查字符串池,如果已经存在相同内容的字符串,就会重用池中的字符串对象,而不会创建新的对象。

2023-12-11 20:57:33 364

原创 【MIT 6.824 分布式系统】Lecture2中的 crawler.go 代码及解析

【代码】【MIT 6.824 分布式系统】Lecture2中的 crawler.go 代码及解析。

2023-10-17 16:46:26 214

原创 【计组】第七章:输入输出系统

这个输入语句具体是如何执行的呢?首先CPU会通过控制总线发送一个读命令,告诉键盘我要读一个数据,然后通过地址总线指明要使用哪个I/O设备。键盘接受到数据后,会将数据放到数据寄存器中。但是CPU怎么知道键盘是否已经工作结束了呢,键盘输入结束后会将结束信号卸载状态寄存器中,表明自己已经输入完成了,然后CPU去查询这个状态寄存器,就能够知道结束了没,然后就去数据寄存器中取数据然后赋值给c这个变量。CPU如何控制键盘I/O的完成?程序查询方式。

2023-07-21 17:28:27 492 1

原创 【MySQL】慢查询+SQL语句优化 (内容源自ChatGPT)

慢查询是指执行SQL查询语句所需要的时间较长,超过了一定阀值,从而导致服务器性能下降。通常情况下,当SQL查询语句执行时间超过1秒以上时就会被任务是慢查询。未使用索引:如果查询没有使用索引或者使用的索引不合理,那么MySQL就不得不全表扫描,这将降低查询速度和对系统资源的占用率。对于大型数据库的操作、尤其是 left join/ left outer join 操作,也可能使查询缓慢甚至崩溃。数据量太大:如果返回的结果集非常大,即时查询本身很快,也很占用大量系统资源,降低服务器性能。

2023-04-28 15:03:48 1722

原创 【Redis】分布式锁的应用以及Redission看门狗机制和MultiLock的源码深入解析

利用 「set nx ex」 获取锁,并设置过期时间,保存线程标识释放锁时先判断线程标识是否与自己一致,一致则删除锁特性:利用 「set nx」 满足互斥性利用 「set ex」设置过期时间,保证故障时锁依然能释放,避免死锁,提高安全性利用 Redis 集群保证高可用和高并发特性。

2023-03-23 22:34:42 2715

原创 【面经】滴滴测开一面

滴滴测开一面

2023-02-16 10:40:02 709

原创 【Java并发编程】变量的线程安全分析

变量的线程安全分析

2023-02-06 16:25:04 2330

原创 【计算机组成原理】y = a * b + c 的执行具体流程

走进计算机硬件的世界

2023-02-04 16:24:56 1675

原创 【Java并发编程】 interrupt 方法详解

interrupt 方法详解

2023-02-03 18:04:17 2349

原创 【Java并发编程] 线程八锁问题

生活总会有惊喜,谁知道下一秒会发生什么呢

2023-01-12 22:17:37 1298

原创 【MySQL】SQL查询语句在MySQL中的执行过程

sql查询语句的执行过程

2023-01-04 15:37:51 786 1

原创 【设计模式】桥接模式 (九)

静下心来

2022-12-28 09:09:17 242

原创 【设计模式】装饰者模式 (八)

加油,挺过去

2022-12-21 10:30:18 194

原创 【设计模式】适配器模式 (七)

身在低估,怎么走都是前进

2022-12-20 10:09:16 449

原创 【设计模式】代理模式 (六)

遵循自己的内心

2022-12-20 09:39:52 464

原创 【设计模式】 建造者模式 (五)

大胆去做

2022-12-17 12:53:09 294

原创 【设计模式】原型模式 (四)

学会接收自己

2022-12-17 11:00:29 110

原创 【Java笔记】 深入理解序列化和反序列化

多思考,多行动

2022-12-16 22:53:17 550

原创 【设计模式】 工厂模式 (三)

提高自己的执行力,那么什么事情都不在是难事。

2022-12-16 21:14:23 628

原创 【面经】国企 Java后端实习生面经

Java后端实习面经

2022-12-15 20:32:00 1427 1

原创 【设计模式】 单例设计模式 (二)

枚举类实现单例模式是极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

2022-12-13 20:58:50 620

原创 【设计模式】 入门(一)

设计模式入门

2022-12-13 18:10:20 553

原创 Docker这么强,谁用都说好

试试看

2022-11-12 21:22:13 2579 4

原创 【RabbitMQ】 RabbitMQ入门到起飞(嘎嘎详细)

抢晴天,抓阴天,牛毛细雨当好天

2022-11-05 17:16:28 335

原创 【Redis】原理篇:Redis过期删除与内存淘汰

Redis监听过期key,过期删除策略和内存淘汰策略

2022-11-03 12:48:07 970 3

原创 【Redis】实战篇:分布式锁解决集群环境下的并发问题

慢慢来,别着急

2022-10-31 21:06:19 2066

原创 【Redis】实战篇:优惠卷秒杀 (库存超卖问题、一人一单问题)

克服了作息问题,那一切都不是问题,加油。

2022-10-30 22:28:34 702

原创 【算法题解】河南师范大学 “青创杯” G : 回文子序列计数

多思考,多练习

2022-10-29 12:01:29 654 3

原创 【Java笔记】Stream流 超详解

如果巅峰留不住,那就进厂包吃住。如果志同道也合,那就流水线回合。

2022-10-26 17:50:53 3796

原创 【Mybatis-Plus】Mybatis-Plus的入门运用

来一把魂斗罗,找找我们的童年

2022-10-25 18:20:12 1577

原创 【Redis】实战篇:商户查询缓存(缓存穿透、缓存雪崩、缓存击穿问题)

进入缓存的世界

2022-10-20 22:05:40 959 3

空空如也

空空如也

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

TA关注的人

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