📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、并发编程知识体系
- 线程基础
线程是程序执行的最小单位,是操作系统进行资源分配和调度的基本单位。在Java中,线程是java.lang.Thread类的实例,其实现依赖于操作系统提供的线程管理机制。线程具有以下特点:
(1)并发:多个线程可以在同一时间段内执行,提高程序的运行效率。这得益于现代操作系统的分时调度机制,允许CPU在多个线程之间快速切换。
(2)共享:线程可以共享进程的资源,如内存、文件等。线程共享进程的内存空间,但每个线程拥有独立的堆栈空间和程序计数器,以避免数据竞争。
(3)独立:线程拥有独立的堆栈空间和程序计数器,执行互不干扰。这意味着线程之间的局部变量是隔离的,但共享资源需要通过同步机制来保护。
(4)异步:线程的执行顺序不受程序控制,需要通过同步机制来协调。线程的启动、执行和结束是异步的,线程间的通信和同步是并发编程的核心挑战。
- 线程生命周期
线程的生命周期分为以下5个阶段:
(1)新建:通过new Thread()创建线程对象。此时线程尚未启动,只存在于内存中。
(2)就绪:线程创建后,调用start()方法,进入就绪状态。线程就绪后,等待CPU时间片,准备开始执行。
(3)运行:线程获取到CPU时间片,开始执行。线程在运行过程中,会执行其任务代码,直到任务完成或遇到阻塞。
(4)阻塞:线程在执行过程中,由于某些原因(如等待锁、等待条件变量等)无法继续执行,进入阻塞状态。此时线程不会占用CPU资源,等待条件满足后恢复执行。
(5)终止:线程执行完毕或被终止,进入终止状态。线程终止后,其资源会被回收,线程对象也会被垃圾回收。
- 线程优先级
线程优先级表示线程获得CPU时间的优先级。Java中,线程优先级分为10个等级,从1(最低)到10(最高)。线程优先级是相对的,操作系统会根据线程优先级和系统负载等因素动态调整线程的执行顺序。
- 守护线程
守护线程是一种特殊的线程,它的生命周期受到主线程的影响。当主线程结束时,所有守护线程也会自动结束。守护线程通常用于执行一些辅助性任务,如垃圾回收器、日志记录等。
- 线程池
线程池是一种管理线程的机制,它将多个线程封装起来,形成一个线程集合。线程池可以提高程序的运行效率,减少线程创建和销毁的开销。线程池的核心参数配置如下:
(1)核心线程数:线程池中最小保持的线程数。当任务提交到线程池时,如果当前线程数小于核心线程数,则创建新的线程来执行任务。
(2)最大线程数:线程池中允许的最大线程数。当任务提交到线程池时,如果当前线程数大于核心线程数且小于最大线程数,则等待空闲线程执行任务。
(3)空闲存活时间:空闲线程在终止前等待新任务的最长时间。超过此时间后,空闲线程将被终止。
(4)工作队列:存放等待执行的任务。工作队列可以是数组、链表或阻塞队列等,根据实际需求选择合适的数据结构。
(5)拒绝策略:当任务无法被线程池处理时,采取的处理策略。常见的拒绝策略有:抛出异常、丢弃任务、丢弃并抛出异常等。
- 同步机制
同步机制用于协调多个线程的执行,防止数据竞争和资源冲突。常用的同步机制有:
(1)悲观锁:在操作数据之前,先加锁,确保数据在操作过程中不会被其他线程修改。悲观锁通常使用synchronized关键字或ReentrantLock实现。
(2)乐观锁:在操作数据时,先不加锁,操作完成后,通过版本号或时间戳判断数据是否被修改。乐观锁通常使用CAS(Compare-And-Swap)操作实现。
(3)读写锁:允许多个线程同时读取数据,但只能有一个线程写入数据。读写锁可以提高并发性能,适用于读多写少的场景。
(4)条件变量:用于线程间的通信,当线程满足特定条件时,才能继续执行。条件变量通常与锁结合使用,实现线程间的同步。
- 并发集合
并发集合是专为多线程环境设计的集合类,具有线程安全特性。常用的并发集合有:
(1)ConcurrentHashMap:线程安全的HashMap,适用于高并发场景。ConcurrentHashMap采用分段锁技术,将数据分成多个段,每个段有自己的锁,从而提高并发性能。
(2)CopyOnWrite容器:在遍历过程中,避免数据被修改,适用于读多写少的场景。CopyOnWrite容器在遍历过程中,复制原容器的一个快照,避免数据竞争。
(3)BlockingQueue:线程安全的队列,支持生产者-消费者模式。BlockingQueue在多线程环境下,可以实现线程间的协作和同步。
- 并发工具类
(1)Phaser:用于协调多个线程的执行,类似于CyclicBarrier和CountDownLatch。Phaser允许线程在执行过程中,等待其他线程到达某个阶段。
(2)Exchanger:用于在线程间交换数据。Exchanger允许两个线程在某个时刻交换数据,然后继续执行。
(3)FutureTask:表示异步计算的结果。FutureTask允许线程提交一个异步任务,并获取任务执行结果。
- 非阻塞算法
非阻塞算法是指在多线程环境中,线程在执行过程中不依赖于其他线程的状态。常用的非阻塞算法有:
(1)CAS原理:比较并交换,用于实现无锁算法。CAS操作包括三个操作数:内存位置、预期值和新值。如果内存位置的值与预期值相等,则将新值写入内存位置。
(2)Atomic类:提供原子操作的类,如AtomicInteger、AtomicLong等。Atomic类通过底层硬件支持,实现无锁的原子操作。
(3)无锁队列:线程安全的队列,无需加锁操作。无锁队列通常使用CAS操作实现,保证线程安全。
- 并发框架
(1)Netty线程模型:采用主从多线程模型,提高服务器吞吐量。Netty将请求分配给多个从线程,主线程负责处理连接和注册从线程。
(2)Akka Actor模型:基于消息传递的并发模型,具有高可用性和可扩展性。Akka Actor模型将每个Actor视为一个独立的线程,通过消息传递实现并发。
(3)Disruptor环形缓冲区:提供高性能的并发队列,适用于高并发场景。Disruptor环形缓冲区通过环形数组实现,避免了传统的队列操作的开销。
二、MyBatis知识体系
- SQL映射
SQL映射是MyBatis的核心功能,用于将Java对象与数据库表进行映射。SQL映射包括以下内容:
(1)注解映射:通过注解实现Java对象与数据库表的映射。MyBatis提供了多种注解,如@Select、@Insert、@Update、@Delete等,方便开发者编写SQL映射。
(2)结果集映射:将查询结果映射到Java对象。MyBatis使用OGNL表达式进行结果集映射,支持复杂的数据类型映射。
(3)关联查询:处理多表关联查询。MyBatis支持多种关联查询方式,如一对一、一对多、多对多等。
(4)动态SQL:根据条件动态生成SQL语句。MyBatis使用OGNL表达式实现动态SQL,支持条件判断、循环等操作。
- OGNL表达式
OGNL(Object-Graph Navigation Language)是一种表达式语言,用于访问对象属性和执行操作。MyBatis中使用OGNL表达式实现动态SQL,支持多种表达式操作,如属性访问、方法调用、条件判断等。
- 分支语句
分支语句用于实现条件查询,根据条件返回不同的SQL语句。MyBatis支持多种分支语句,如if、choose、when、otherwise等。
- 批量操作
批量操作可以将多个SQL语句合并成一个,提高数据库操作效率。MyBatis支持批量插入、批量更新、批量删除等操作。
- 缓存机制
MyBatis提供了一级缓存和二级缓存机制,用于提高查询效率。
(1)一级缓存:基于SqlSession的生命周期,用于缓存查询结果。当SqlSession关闭时,一级缓存也会被清空。
(2)二级缓存:基于namespace,用于缓存查询结果。二级缓存可以在多个SqlSession之间共享,提高缓存利用率。
(3)自定义缓存:自定义缓存实现,提高缓存扩展性。MyBatis支持自定义缓存实现,方便开发者根据实际需求进行缓存管理。
- 代理模式
MyBatis使用代理模式实现Mapper接口的动态代理,提高代码的可读性和可维护性。代理模式将Mapper接口的实现委托给MyBatis,实现代码的解耦。
- MapperProxy插件拦截
MapperProxy是MyBatis的插件拦截机制,用于拦截Mapper接口的方法,实现自定义功能。插件拦截机制允许开发者自定义拦截器,拦截数据库操作,实现自定义功能。
- 动态代理执行流程
动态代理执行流程如下:
(1)调用Mapper接口方法。
(2)MapperProxy代理调用。
(3)MyBatis处理SQL映射。
(4)执行数据库操作。
(5)返回结果。
- SqlSession生命周期
SqlSession是MyBatis的核心对象,用于执行数据库操作。SqlSession生命周期如下:
(1)创建SqlSession。
(2)执行数据库操作。
(3)关闭SqlSession。
- 执行器类型
MyBatis提供以下执行器类型:
(1)SimpleExecutor:简单执行器,适用于小型项目。SimpleExecutor直接使用JDBC连接,执行数据库操作。
(2)ReuseExecutor:重用执行器,提高数据库连接复用率。ReuseExecutor在执行数据库操作时,复用数据库连接,减少连接创建和销毁的开销。
(3)BatchExecutor:批量执行器,提高批量操作效率。BatchExecutor将多个SQL语句合并成一个批量操作,提高数据库操作效率。
- 延迟加载
延迟加载是指在需要时才加载数据,减少数据库访问次数。MyBatis支持延迟加载,提高查询效率。
- 扩展机制
MyBatis提供以下扩展机制:
(1)类型处理器:用于处理Java类型与数据库类型的转换。MyBatis支持自定义类型处理器,方便开发者处理复杂的数据类型转换。
(2)拦截器链:用于拦截数据库操作,实现自定义功能。MyBatis支持自定义拦截器,拦截数据库操作,实现自定义功能。
(3)方言支持:支持不同数据库的方言。MyBatis支持自定义方言,方便开发者处理不同数据库的SQL语法差异。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~