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

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

一、并发编程知识体系
并发编程是现代软件工程中的一个重要领域,它涉及如何设计系统以有效地同时执行多个任务。以下是对并发编程知识体系的深入探讨。
1. 线程基础
线程是操作系统分配处理器时间的基本单位。以下是线程实现的一些关键技术细节:
- 线程生命周期:线程从创建(通过创建函数如
pthread_create
)、就绪(等待调度)、运行(处理器正在执行线程的代码)、阻塞(执行过程中因某些条件未满足而暂停)、等待(主动放弃CPU时间片)、超时(等待条件未满足超过一定时间)、终止(线程完成或被终止)等状态进行转换。 - 线程优先级:线程优先级通常由操作系统的调度算法决定,它决定了线程在获得CPU时间片时的优先顺序,高级线程更有可能获得CPU时间。
- 守护线程:守护线程(也称为后台线程)是服务于其他线程的线程。当所有的非守护线程结束时,守护线程也会自动结束,这是因为在Java中,一个线程不能在守护线程仍在运行时终止。
- 线程池:线程池通过重用已有的线程来执行任务,这样可以减少线程创建和销毁的开销。线程池的实现通常涉及核心线程数、最大线程数、线程存活时间、队列类型(如LinkedBlockingQueue、ArrayBlockingQueue等)和拒绝策略(如CallerRunsPolicy、AbortPolicy等)。
2. 核心参数配置
线程池的参数配置对于线程池的性能至关重要:
- 核心线程数:线程池启动时创建的线程数,即使没有任务执行,这些线程也会保持活动状态。
- 最大线程数:线程池能够创建的最大线程数,当任务数量超过核心线程数时,额外的线程将被创建。
- 线程存活时间:空闲线程在终止前可以保持的最大时间,超过这个时间线程将被终止。
- 队列类型:线程池中的任务队列决定了如何存储等待执行的任务,不同的队列类型具有不同的性能特点。
- 拒绝策略:当线程池无法处理新任务时,拒绝策略决定了如何处理这些任务,常见的策略包括丢弃任务、抛出异常、执行任务等。
3. 同步机制
同步机制是确保多线程正确访问共享资源的关键:
- 悲观锁/乐观锁:悲观锁假设冲突将会发生,因此总是先锁定资源。乐观锁假设冲突不会发生,只在更新数据时检查冲突。
- 读写锁:读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。读锁是共享的,写锁是互斥的。
- 条件变量:条件变量允许线程在满足特定条件时阻塞等待,直到其他线程触发条件变量,从而唤醒等待的线程。
4. 并发集合
并发集合是专门为并发环境设计的集合类:
- ConcurrentHashMap:ConcurrentHashMap使用了分段锁(Segment Locking)技术,将数据分为多个段,每个段有自己的锁,从而允许多个线程并发访问。
- CopyOnWrite容器:CopyOnWrite容器在写操作时创建一个新的容器副本,以避免读操作时的锁竞争。
- BlockingQueue:BlockingQueue是线程安全的队列实现,支持生产者和消费者模式,常用作线程间通信的桥梁。
5. 并发工具类
并发工具类提供了许多方便的并发编程功能:
- Phaser:Phaser是一个协调多个线程进度的工具,它可以跟踪线程的进度,并在需要时阻塞或唤醒线程。
- Exchanger:Exchanger允许两个线程交换数据,这对于需要同步交换数据的场景非常有用。
- FutureTask:FutureTask代表了一个异步计算的结果,它可以用来查询异步任务的状态,并获取计算结果。
6. 非阻塞算法
非阻塞算法通过减少线程阻塞来提高并发性能:
- CAS原理:CAS(Compare-And-Swap)是一种原子操作,它允许在不锁定资源的情况下更新数据。
- Atomic类:Java中的Atomic类提供了原子操作的方法,如AtomicInteger、AtomicLong等,这些类用于实现无锁的线程安全编程。
- 无锁队列:无锁队列通过原子操作实现线程安全,它不依赖于任何形式的锁,从而减少了线程之间的竞争。
7. 并发框架
并发框架提供了高级的并发编程抽象:
- Netty线程模型:Netty采用主从多线程模型,主线程负责接收和处理连接,从线程负责处理IO操作,这种模型适用于高并发场景。
- Akka Actor模型:Akka使用actor模型,每个actor独立运行,通过消息传递进行通信,这种模型适用于分布式系统。
- Disruptor环形缓冲区:Disruptor使用环形缓冲区来存储数据,并通过序列号来管理线程间的协调,这种模型适用于高并发场景。
二、MyBatis知识体系
MyBatis是一个优秀的持久层框架,它通过XML或注解的方式将Java对象与SQL语句进行映射。
1. SQL映射
SQL映射是MyBatis的核心概念,以下是SQL映射的实现细节:
- 注解映射:MyBatis提供了多种注解来定义SQL映射,如
@Select
、@Insert
、@Update
、@Delete
等。 - 结果集映射:MyBatis使用
<resultMap>
元素来定义如何将SQL查询结果映射到Java对象,包括字段映射、类型转换等。 - 关联查询:MyBatis支持多表关联查询,通过嵌套的
<resultMap>
来处理复杂的关联关系。 - 动态SQL:MyBatis使用
<choose>
、<when>
、<otherwise>
等元素来构建动态SQL,支持条件判断和批量操作。
2. 动态SQL
动态SQL是MyBatis的高级特性,以下是动态SQL的实现细节:
- OGNL表达式:OGNL(Object-Graph Navigation Language)表达式用于在动态SQL中访问Java对象的属性。
- 分支语句:MyBatis支持在动态SQL中使用
<if>
、<choose>
等元素来根据条件执行不同的SQL语句。 - 批量操作:MyBatis支持批量操作,通过
<foreach>
元素可以同时执行多个SQL语句。
3. 缓存机制
MyBatis提供了缓存机制,以下是缓存机制的实现细节:
- 一级缓存:一级缓存是SqlSession级别的缓存,它缓存了从数据库查询到的数据,以提高查询效率。
- 二级缓存:二级缓存是SqlSessionFactory级别的缓存,它可以在不同的SqlSession之间共享缓存,适用于跨SqlSession的缓存需求。
- 自定义缓存:MyBatis允许自定义缓存实现,通过实现
Cache
接口来定义自己的缓存策略。
4. 代理模式
MyBatis使用代理模式来实现Mapper接口,以下是代理模式的相关细节:
- MapperProxy:MyBatis使用
MapperProxy
类来实现对Mapper接口的代理,它负责拦截Mapper接口的方法调用。 - 插件拦截:MyBatis允许通过插件来拦截Mapper接口的方法调用,从而实现扩展功能。
- 动态代理执行流程:MyBatis使用动态代理技术来创建Mapper接口的代理实例,代理实例负责处理方法调用。
5. SqlSession生命周期
SqlSession是MyBatis的会话对象,以下是SqlSession生命周期的相关细节:
- 创建SqlSession:通过MyBatis的SqlSessionFactory创建SqlSession对象。
- 执行操作:通过SqlSession执行SQL语句,如查询、更新、删除等。
- 关闭SqlSession:释放资源,关闭数据库连接。
6. 执行器类型
MyBatis提供了多种执行器类型,以下是执行器类型的实现细节:
- 简单执行器:适用于小型应用,它使用最简单的机制来执行SQL语句。
- 批量执行器:适用于执行批量操作,它通过批量提交来减少数据库访问次数。
- 缓存执行器:结合缓存机制提高查询效率,它首先检查缓存中是否存在数据,如果存在则直接返回缓存数据。
7. 扩展机制
MyBatis提供了多种扩展机制,以下是扩展机制的相关细节:
- 类型处理器:类型处理器用于处理Java类型与数据库类型之间的转换。
- 拦截器链:拦截器链用于拦截和修改数据库操作,如查询、更新、删除等。
- 方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle等,通过方言可以定制数据库特定的行为。
通过以上对并发编程和MyBatis知识体系的深入探讨,我们可以了解到这两个领域的核心概念、技术原理和应用场景。在实际开发中,合理运用并发编程和MyBatis框架,可以显著提高程序的执行效率和稳定性。
📥博主的人生感悟和目标

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

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