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

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

一、并发编程知识体系
线程基础
在并发编程中,线程是程序执行的最小单元,它允许操作系统在同一时间处理多个任务。线程的基础操作包括创建、调度和同步。
线程生命周期
线程的生命周期是线程从创建到销毁的整个过程,它包括以下六个状态:
- 新建(New):线程对象被创建后,进入新建状态。
- 就绪(Runnable):线程被创建后,需要等待CPU时间片,进入就绪状态。
- 运行(Running):线程获得CPU时间片,开始执行。
- 阻塞(Blocked):线程因为某些原因(如等待资源)无法继续执行,进入阻塞状态。
- 等待(Waiting):线程主动放弃CPU时间片,进入等待状态,直到被唤醒。
- 超时等待(Timed Waiting):线程在等待状态中设置超时时间,超过这个时间后自动唤醒。
- 终止(Terminated):线程执行完毕或被强制终止,进入终止状态。
线程优先级
线程优先级决定了线程在CPU上的调度顺序。在Java中,线程优先级分为1到10级,优先级越高,CPU调度概率越大。线程优先级是一个相对值,具体调度策略由JVM实现。
守护线程
守护线程是服务其他线程的线程。当所有非守护线程结束时,守护线程也会自动结束。在Java中,可以通过调用Thread.setDaemon(true)将线程设置为守护线程。
线程池
线程池是一种复用线程的技术,可以提高程序的性能。线程池的核心参数配置包括:
- 核心线程数:线程池中始终存在的线程数量。
- 最大线程数:线程池允许的最大线程数量。
- 线程存活时间:线程空闲时间超过这个值时,将被回收。
- 工作队列:存放等待执行的任务的队列。
- 拒绝策略:当线程池无法处理新任务时的行为。
拒绝策略
拒绝策略决定了当线程池无法处理新任务时的行为。常见的拒绝策略有:
- AbortPolicy(抛出异常):线程池拒绝任务时,抛出RejectedExecutionException异常。
- CallerRunsPolicy(调用者运行):线程池拒绝任务时,将任务交还给调用者线程执行。
- DiscardPolicy(丢弃任务):线程池拒绝任务时,直接丢弃任务。
- DiscardOldestPolicy(丢弃最旧任务):线程池拒绝任务时,丢弃队列中最旧的任务。
工作队列类型
工作队列用于存放等待执行的任务。常见的工作队列类型有:
- LinkedBlockingQueue:基于链表的阻塞队列,支持无限大小的队列。
- ArrayBlockingQueue:基于数组的阻塞队列,支持固定大小的队列。
- SynchronousQueue:同步队列,不存储元素,生产者和消费者线程必须同步。
同步机制
同步机制包括悲观锁和乐观锁、读写锁、条件变量和并发集合。
悲观锁/乐观锁
悲观锁和乐观锁是处理并发问题的两种策略。悲观锁认为冲突一定会发生,因此在操作数据时加锁;乐观锁认为冲突很少发生,因此在操作数据时使用版本号或时间戳等机制。
读写锁
读写锁允许多个读线程同时访问数据,但只允许一个写线程访问数据。在Java中,可以使用ReentrantReadWriteLock实现读写锁。
条件变量
条件变量是线程间的通信机制。当一个线程在等待某个条件时,其他线程可以改变这个条件,唤醒等待线程。在Java中,可以使用Object的wait()、notify()和notifyAll()方法实现条件变量。
并发集合
并发集合是为了提高并发程序性能而设计的集合类,如ConcurrentHashMap。
ConcurrentHashMap
ConcurrentHashMap是Java中常用的线程安全集合,它采用分段锁技术,提高并发访问效率。在ConcurrentHashMap中,数据被分成多个段,每个段有自己的锁,这样多个线程可以同时访问不同的段。
CopyOnWrite容器
CopyOnWrite容器在写操作时,会创建当前元素的副本,避免了读写冲突。在Java中,可以使用CopyOnWriteArrayList实现CopyOnWrite容器。
BlockingQueue
BlockingQueue是一种线程安全的队列,支持阻塞操作,如put和take。在Java中,可以使用ArrayBlockingQueue、LinkedBlockingQueue和PriorityBlockingQueue等实现BlockingQueue。
并发工具类
并发工具类包括Phaser、Exchanger和FutureTask。
Phaser
Phaser是一种线程同步机制,用于控制线程的执行顺序。Phaser允许线程在执行过程中加入或退出,并且可以控制线程的执行顺序。
Exchanger
Exchanger是一种线程间交换数据的机制。两个线程在交换点相遇,交换数据后继续执行。
FutureTask
FutureTask是Java中实现异步执行任务的工具类。FutureTask可以获取异步执行的结果,并且可以取消任务。
非阻塞算法
非阻塞算法利用CAS(Compare and Swap)原理实现线程安全,如Atomic类和无锁队列。
CAS原理
CAS是一种原子操作,用于在多线程环境中实现无锁编程。CAS操作包括三个操作数:内存位置V、预期值A和新值B。当内存位置V的值与预期值A相同时,将内存位置V的值修改为新值B,否则不做任何操作。
Atomic类
Atomic类提供了一系列的原子操作,如AtomicInteger、AtomicLong等。这些类可以保证在多线程环境中对共享数据的操作是原子的。
无锁队列
无锁队列利用CAS原理实现线程安全,如ConcurrentLinkedQueue。无锁队列不需要锁机制,可以提高并发性能。
并发框架
并发框架包括Netty线程模型、Akka Actor模型和Disruptor环形缓冲区。
Netty线程模型
Netty采用主从多线程模型,提高网络应用性能。主线程负责接收客户端连接,从线程负责处理业务逻辑。
Akka Actor模型
Akka Actor模型是一种基于消息传递的并发模型,具有良好的伸缩性和容错性。在Akka中,每个Actor都是一个消息处理器,可以独立运行。
Disruptor环形缓冲区
Disruptor环形缓冲区是一种高性能的并发队列,用于处理高并发场景。Disruptor环形缓冲区通过环形数组存储数据,并使用CAS操作实现线程安全。
二、MyBatis知识体系
SQL映射
SQL映射是MyBatis的核心功能,将Java对象与数据库表进行映射。在MyBatis中,可以使用XML配置或注解进行SQL映射。
注解映射
MyBatis支持使用注解进行SQL映射,提高开发效率。例如,可以使用@Select、@Insert、@Update和@Delete等注解定义SQL语句。
结果集映射
结果集映射用于将查询结果映射到Java对象。在MyBatis中,可以使用 元素定义结果集映射。
关联查询
关联查询用于处理多表关联查询,实现复杂业务逻辑。在MyBatis中,可以使用 和 元素定义关联查询。
动态SQL
动态SQL支持根据条件动态拼接SQL语句,提高SQL语句的复用性。在MyBatis中,可以使用 、 、 和 等元素实现动态SQL。
OGNL表达式
OGNL表达式是一种表达式语言,用于实现动态SQL。OGNL表达式可以访问对象的属性、调用方法、执行逻辑运算等。
分支语句
分支语句支持根据条件执行不同的SQL语句。在MyBatis中,可以使用 、 、 和 等元素实现分支语句。
批量操作
批量操作支持一次性执行多条SQL语句,提高数据库操作效率。在MyBatis中,可以使用 元素实现批量操作。
缓存机制
缓存机制可以提高查询性能,减少数据库访问次数。在MyBatis中,可以使用一级缓存、二级缓存和自定义缓存。
一级缓存
一级缓存是MyBatis内部的缓存,用于存储最近执行的SQL查询结果。一级缓存默认开启,但可以通过设置mybatis.config.xml中的 元素的 属性关闭。
二级缓存
二级缓存是应用级别的缓存,用于存储跨SqlSession的查询结果。二级缓存需要手动开启,并配置相应的缓存实现类。
自定义缓存
自定义缓存支持根据业务需求自定义缓存策略。在MyBatis中,可以通过实现Cache接口自定义缓存。
代理模式
代理模式用于实现延迟加载和动态代理,提高性能。在MyBatis中,可以使用MapperProxy实现动态代理。
MapperProxy
MapperProxy是MyBatis中的动态代理,用于代理Mapper接口。当调用Mapper接口的方法时,MapperProxy会根据XML配置或注解生成相应的SQL语句,并执行数据库操作。
插件拦截
插件拦截是MyBatis的一种扩展机制,可以拦截SQL执行过程,实现自定义功能。在MyBatis中,可以通过实现Interceptor接口自定义插件。
动态代理执行流程
动态代理执行流程包括代理对象的创建、方法调用和目标对象的执行。当调用代理对象的方法时,动态代理会根据XML配置或注解生成相应的SQL语句,并执行数据库操作。
SqlSession生命周期
SqlSession是MyBatis的核心对象,负责数据库操作。SqlSession的生命周期包括以下阶段:
- 创建SqlSession:通过SqlSessionFactory创建SqlSession。
- 执行数据库操作:使用SqlSession执行数据库操作。
- 关闭SqlSession:关闭SqlSession,释放资源。
执行器类型
MyBatis支持多种执行器类型,如SimpleExecutor和ReuseExecutor。
延迟加载
延迟加载是一种优化性能的技术,在需要时才加载对象。在MyBatis中,可以使用 和 元素的 属性实现延迟加载。
扩展机制
MyBatis提供了一系列扩展机制,如类型处理器和拦截器链。
类型处理器
类型处理器用于处理Java类型与数据库类型的映射。在MyBatis中,可以通过实现TypeHandler接口自定义类型处理器。
拦截器链
拦截器链用于拦截SQL执行过程,实现自定义功能。在MyBatis中,可以通过实现Interceptor接口自定义拦截器。
方言支持
方言支持允许根据不同的数据库类型使用不同的SQL语法。在MyBatis中,可以通过实现Dialect接口自定义方言。
📥博主的人生感悟和目标

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

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