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

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

一、并发编程知识体系
线程基础
在并发编程中,线程是程序执行的最小单位,它允许多个任务并行执行,从而提高程序的响应速度和效率。理解线程的基础知识是深入探索并发编程的关键。
线程生命周期
线程的生命周期是一个复杂的过程,涉及多个阶段。在Java中,线程的生命周期可以分为以下七个阶段:
- 新建(New):线程对象被创建,但是还没有被启动。
- 就绪(Runnable):线程对象已经准备好执行,等待被调度执行。
- 运行(Running):线程正在被CPU执行。
- 阻塞(Blocked):线程因为某些原因无法执行,例如等待资源或等待某个条件成立。
- 等待(Waiting):线程处于等待状态,直到某个条件成立。
- 超时等待(Timed Waiting):线程处于等待状态,直到某个条件成立或者等待时间超过了指定的时间。
- 终止(Terminated):线程执行完毕,生命周期结束。
线程在生命周期中的状态转换是由线程调度器控制的,线程调度器负责根据一定的调度策略来选择哪个线程执行。
线程优先级
线程优先级是线程调度器在调度线程时考虑的一个因素,它表示线程获得CPU执行时间的优先程度。Java中,线程优先级分为1到10共10个等级,优先级高的线程有更大的机会被调度执行。线程优先级并不是绝对的,线程调度器会根据实际情况来调整线程的执行顺序。
守护线程
守护线程是一种特殊的线程,它为其他线程提供服务。当所有非守护线程结束时,守护线程也会自动结束。守护线程通常用于执行一些不需要用户交互的辅助性任务,例如垃圾回收器。
线程池
线程池是管理一组线程的集合,它能够提高程序的性能和资源利用率。线程池的核心参数配置包括核心线程数、最大线程数、存活时间、工作队列类型等。线程池通过重用现有的线程来减少线程创建和销毁的开销,从而提高程序的执行效率。
拒绝策略
当线程池达到最大线程数时,如果还有任务提交,线程池会根据拒绝策略决定如何处理新任务。常见的拒绝策略有:
- AbortPolicy(抛出异常):当线程池已满时,抛出RejectedExecutionException异常。
- CallerRunsPolicy(调用者运行):当线程池已满时,将任务回退给调用者线程执行。
- DiscardPolicy(丢弃任务):当线程池已满时,直接丢弃任务。
- DiscardOldestPolicy(丢弃最旧任务):当线程池已满时,丢弃队列中最旧的任务。
同步机制
同步机制是保证多线程安全的重要手段,主要包括:
- 悲观锁:假设并发操作会引发冲突,因此在操作开始时就加锁,直到操作完成才释放锁。常见的悲观锁实现有synchronized关键字和ReentrantLock等。
- 乐观锁:假设并发操作不会引发冲突,只在操作完成后检查是否有冲突,如果有则重新操作。常见的乐观锁实现有CAS(Compare-And-Swap)算法等。
- 读写锁:允许多个线程同时读取数据,但只有一个线程可以写入数据。常见的读写锁实现有ReentrantReadWriteLock等。
- 条件变量:允许线程在满足特定条件时进行等待,直到条件满足时才继续执行。常见的条件变量实现有Condition接口等。
并发集合
并发集合是为了解决多线程环境下数据结构的安全问题而设计的。常见的并发集合包括:
- ConcurrentHashMap:线程安全的HashMap实现,基于分段锁(Segment Locking)技术,提高了并发访问效率。
- CopyOnWrite容器:在写操作时创建一个新的副本,避免数据竞争。适用于读多写少的场景。
- BlockingQueue:线程安全的队列实现,支持生产者-消费者模型。常见的实现有ArrayBlockingQueue、LinkedBlockingQueue等。
并发工具类
- Phaser:一个灵活的同步工具,可以用于协调多个线程的执行顺序。Phaser允许线程在某个阶段暂停,等待其他线程到达该阶段。
- Exchanger:允许两个线程在某个时刻交换数据。
- FutureTask:代表异步计算的结果。
非阻塞算法
非阻塞算法通过使用原子操作和条件变量等技术,实现线程间的无锁通信。常见的非阻塞算法有CAS(Compare-And-Swap)算法等。
CAS原理
CAS(Compare-And-Swap)是一种无锁算法,它通过比较和交换操作来更新数据,从而避免锁的开销。CAS算法包含三个操作数:内存位置V、预期原值A和新值B。当V的值等于A时,将V的值修改为B,否则不做任何操作。
Atomic类
Atomic类提供了一系列原子操作,如AtomicInteger、AtomicLong等,用于处理基本数据类型的原子操作。这些类内部使用CAS算法来保证操作的原子性。
无锁队列
无锁队列是一种基于CAS原理实现的线程安全队列,它允许多个线程并发访问,而不需要使用锁。常见的无锁队列实现有ConcurrentLinkedQueue等。
并发框架
- Netty线程模型:Netty使用主从多线程模型,一个Boss线程负责接收客户端连接,多个Worker线程负责处理业务逻辑。这种模型提高了并发处理能力,并降低了系统开销。
- Akka Actor模型:Akka使用Actor模型,每个Actor是一个消息处理器,可以并发地处理消息。Actor模型具有高度的并发性和容错性,适用于构建分布式系统。
- Disruptor环形缓冲区:Disruptor使用环形缓冲区,通过发布-订阅模式实现线程间的通信。这种模式具有低延迟和高吞吐量的特点,适用于构建高性能并发系统。
二、MyBatis知识体系
SQL映射
MyBatis通过XML或注解的方式将SQL语句与Java对象进行映射。这种映射关系使得开发者可以专注于业务逻辑,而无需关心SQL语句的编写。
注解映射
MyBatis提供了一系列注解,如@Select、@Insert、@Update、@Delete等,用于定义SQL映射。这些注解可以简化SQL映射的编写过程,提高代码的可读性和可维护性。
结果集映射
MyBatis可以将查询结果映射到Java对象,包括基本类型、集合、自定义类型等。这种映射关系可以简化数据的处理过程,提高代码的效率。
关联查询
MyBatis支持关联查询,可以方便地处理一对多、多对多等关系。关联查询通过嵌套的SELECT语句来实现,可以有效地处理复杂的数据库关系。
动态SQL
MyBatis支持动态SQL,可以根据条件动态生成SQL语句。动态SQL可以通过 、 、 等标签来实现,提高了SQL语句的灵活性和可维护性。
OGNL表达式
OGNL(Object-Graph Navigation Language)是一种表达式语言,用于在MyBatis中访问对象属性和执行逻辑操作。OGNL表达式可以方便地访问对象的属性、执行条件判断、循环等操作。
分支语句
MyBatis支持分支语句,可以根据条件执行不同的SQL片段。分支语句通过 、 、 、 等标签来实现,提高了SQL语句的灵活性和可维护性。
批量操作
MyBatis支持批量操作,可以同时执行多条SQL语句。批量操作可以显著提高数据库操作的效率,减少数据库访问次数。
缓存机制
MyBatis提供了缓存机制,包括一级缓存和二级缓存。
一级缓存
一级缓存是SqlSession级别的缓存,用于缓存SqlSession执行过的查询结果。当SqlSession关闭时,一级缓存会自动失效。
二级缓存
二级缓存是Mapper级别的缓存,用于缓存Mapper执行过的查询结果。二级缓存可以跨SqlSession持久化,提高了查询效率。
自定义缓存
MyBatis允许自定义缓存,通过实现Cache接口来实现。自定义缓存可以根据业务需求进行定制,提高了缓存的灵活性和可扩展性。
代理模式
MyBatis使用代理模式实现Mapper接口,通过动态代理技术创建Mapper实例。动态代理可以减少代码量,提高代码的可维护性。
MapperProxy
MapperProxy是MyBatis用于创建Mapper实例的动态代理类。它通过反射调用Mapper接口的方法,并处理SQL映射和结果集映射等操作。
插件拦截
MyBatis允许通过插件拦截SQL执行过程,实现自定义功能。插件可以拦截SQL的执行、参数处理、结果处理等操作,提高了MyBatis的扩展性。
动态代理执行流程
MyBatis通过动态代理技术实现Mapper接口,执行流程如下:
- 创建MapperProxy实例。
- 使用反射调用Mapper接口的方法。
- 调用MyBatis的执行器执行SQL语句。
- 返回执行结果。
SqlSession生命周期
SqlSession是MyBatis的核心对象,它代表了与数据库的会话。SqlSession的生命周期包括创建、使用和关闭。创建SqlSession通常通过SqlSessionFactory来获取,使用完毕后需要关闭SqlSession以释放资源。
执行器类型
MyBatis提供了多种执行器类型,如SimpleExecutor、ReusingExecutor和BatchExecutor,用于执行SQL语句。不同的执行器类型具有不同的特点,可以根据业务需求选择合适的执行器类型。
延迟加载
MyBatis支持延迟加载,可以在需要时才加载关联对象。延迟加载可以减少数据库访问次数,提高查询效率。
扩展机制
MyBatis提供了多种扩展机制,如类型处理器、拦截器链和方言支持,用于扩展MyBatis的功能。
类型处理器
类型处理器用于将数据库类型转换为Java类型。MyBatis提供了多种类型处理器,可以方便地处理不同类型的数据库字段。
拦截器链
拦截器链用于拦截SQL执行过程,实现自定义功能。MyBatis提供了多种拦截器,可以拦截SQL的执行、参数处理、结果处理等操作。
方言支持
MyBatis支持多种数据库方言,如MySQL、Oracle等。方言支持可以方便地处理不同数据库的特有语法和功能。
通过以上知识体系的介绍,我们可以看到并发编程和MyBatis在实现高性能、可扩展的应用程序中的重要性。在实际开发中,我们需要根据具体需求选择合适的并发策略和MyBatis配置,以达到最佳的性能和可维护性。
📥博主的人生感悟和目标

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

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