自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【并发编程 | 第八篇】深入学习线程池(二)

书接上文,没看过的可以先去看看我写的关于线程池的第一篇博客。

2025-04-07 11:50:24 522

原创 【并发编程 | 第七篇】深入学习线程池(一)

线程池是用来管理和复用线程的⼯具,它可以减少线程的创建和销毁开销。在 Java 中,ThreadPoolExecutor 是线程池的核⼼实现,它通过核⼼线程数、最⼤线程数、任务队列和拒绝策略来 控制线程的创建和执⾏。举个栗子:就像你开了⼀家餐厅,线程池就相当于固定数量的服务员,顾客(任务)来了就安排空闲的服务员(线 程)处理,避免了频繁招⼈和解雇的成本。

2025-04-06 23:06:45 526

原创 【并发编程 | 第六篇】深入学习synchronized关键字

是 Java 中的一个关键字,翻译成中文是同步的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。在 Java 早期版本中,属于,效率低下。这是因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。

2025-04-05 17:09:14 1092

原创 【并发编程 | 第五篇】探索ThreadLocal的原理

是 Java 提供的一个线程本地变量工具类,用于在多线程环境下为每个线程提供独立的变量副本。简单来说,它能让每个线程拥有自己的“储物柜”,存储仅对自己可见的数据,,同时减少同步锁的开销。当你创建一个变量时,每个访问该变量的线程都会拥有一个独立的副本。这也是名称的由来。线程可以通过get()方法获取自己线程的本地副本,或通过set()方法修改该副本的值,从而避免了线程安全问题。

2025-04-04 16:19:09 1518

原创 【并发编程 | 第四篇】悲观锁与乐观锁的学习

包含悲观锁与乐观锁的定义,像synchronized、ReentrantLock等都是常见的悲观锁,而乐观锁其实并没有锁,是通过版本号机制和CAS技术等方法实现的,同时还介绍了CAS的原理、如何实现的原子操作以及CAS存在的问题。

2025-04-03 12:27:37 1400

原创 【并发编程 | 第三篇】Java内存模型JMM的详解

CPU缓存是位于CPU和主内存(RAM)之间的高速存储器,用于减少CPU访问数据的延迟。由于CPU速度远快于内存,缓存通过存储频繁访问的数据副本,避免CPU因等待内存响应而闲置。为什么要弄一个 CPU 高速缓存呢?类比我们开发网站后台系统使用的缓存(比如 Redis)是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们甚至可以把内存看作外存的高速缓存。

2025-03-31 14:02:30 710

原创 【并发编程 | 第二篇】如何理解多线程以及死锁

线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》)://资源 1//资源 2try {}, "线程 1").start();try {

2025-03-28 17:52:34 703

原创 【并发编程 | 第一篇】线程相关基础知识

并发是指多核CPU上的多任务处理,多个任务在同一时刻真正同时执行。并行是指单核CPU上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决IO密集型瓶颈。如何理解线程安全呢?如果一段代码块或者一个方法被多个线程同时并发执行,其中的共享内容还能够有序正确的执行,就说明是线程安全的。一个操作如果执行要么成功,要么失败,不会只执行一部分。可以通过同步关键字 synchronized 或原⼦操作,如 AtomicInteger 来保证原子性。

2025-03-27 18:41:57 1466

原创 一次性解释清楚redis缓存三大问题

通常面试或者学习redis涉及到的redis缓存三大问题为缓存击穿、缓存穿透以及缓存雪崩。下面就逐一讲解什么是缓存击、穿透以及雪崩,附上它们常见的解决方法。

2025-03-26 13:37:37 1471

原创 MySQL的事务原理及MVCC

事务简介、特性的讲解以及三种读取问题和事务隔离级别,mvcc的介绍和原理的解释

2025-03-21 17:43:00 1109

原创 数据库日志(binlog、redo log、undo log)

又称归档日志,由binlog是一种记录对表数据进行增删改操作以及表结构改变的二进制文件。update、delete、insert、create table等等语句都会被记录,binlog记录的是sql语句,属于逻辑日志。并且binlog是追击写入的,即写满一个文件后,会再创建一个文件接着写入,文件名称是mysql-bin.xxxxxx,如mysql-bin.000001,序号递增。

2025-03-20 17:28:59 573

原创 MySQL的锁机制(复习笔记)

MySQL中的锁按照锁的粒度来分,以下三种:全局锁:锁定数据库的全部表表级锁:每次操作锁定整张表行级锁:每次操作锁定表中的一条数据。

2025-03-19 21:55:44 538

原创 MySQL中的索引

MySQL索引简介

2025-03-18 11:07:21 780

原创 HashMap的扩容机制以及jdk1.8之后的优化

为了减少哈希冲突发⽣的概率,当当前HashMap的元素个数达到⼀个临界值的时候,就会触发扩容, 把所有元素rehash之后再放在扩容后的容器中,这是⼀个相当耗时的操作。⽽这个 临界值threshold 就是由加载因⼦和当前容器的容量大小来确定的,假如采⽤默认的构造⽅法:临界值(threshold )= 默认容量(DEFAULT_INITIAL_CAPACITY) * 默认扩容因⼦ (DEFAULT_LOAD_FACTOR)为什么选择0.75为扩容因子呢?

2025-03-12 20:16:12 1058

原创 如何在项目中整合Knife4j实现API文档生成和RESTful Web测试?

这样配置后,当Spring Boot应用运行时,它会自动处理这些静态资源的请求,并从相应的目录中提供资源。可以看到该接口是POST类型的,是RESTful风格,同时还有该接口的访问路径以及请求参数和示例等等。knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。Knife4j 完全遵循了 Swagger 的使用方式,所以可以无缝切换。支持动态参数,允许用户在运行时修改API请求的参数,测试更加灵活。你可以任意修改请求参数,通过点击发送来测试接口,测试十分灵活。

2025-03-09 15:41:52 735

原创 HashMap的哈希/扰动函数底层原理

以 String 类为例,它根据字符串的字符序列计算哈希值,保证相同内容的字符串哈希值相同,不同内容的字符串哈希值尽量不同。得到的初始哈希值是⼀个32位的int类型的数值,然后让hashcode的⾼ 16位和低16位进⾏异或操作,使得哈希值的高位和低位都参与运算,进一步打乱哈希值,使其分布更均匀。使不同的键能均匀地分布在哈希表中,减少哈希冲突,即尽量让不同的键计算出的哈希值分散在哈希表的不同位置,提高存储和查找效率。能够快速地计算出键的哈希值,以保证HashMap的插入、查找和删除等操作具有较好的性能。

2025-03-07 15:23:19 258

原创 如何在电脑上配置多个jdk版本呢?

当项目或一些版本要求与我们电脑上的jdk版本不匹配,该如何在电脑上进行多个jdk的配置与切换呢?

2025-03-04 16:03:24 397

原创 JWT的使用原理及执行流程

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。其核心特点是通过紧凑且自包含的 JSON 对象传递数据,无需服务端存储会话状态。

2025-03-04 10:48:20 1119 1

空空如也

空空如也

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

TA关注的人

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