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

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

一、并发编程知识体系
线程基础
在并发编程中,线程是程序执行的最小单位。线程的基础包括线程的创建、调度、同步和通信等方面。线程的创建可以通过多种方式实现,例如使用Java中的Thread
类或通过实现Runnable
接口。线程的调度由操作系统的调度器负责,它根据线程的优先级、线程状态和CPU的使用情况来决定线程的执行顺序。
线程生命周期
线程的生命周期包括以下六个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程在创建后进入新建状态,然后变为就绪状态等待CPU调度。一旦被调度,线程将进入运行状态。线程在执行过程中可能会因为某些条件而进入阻塞或等待状态,如等待某个资源或等待另一个线程的通知。当线程的任务完成后,它将进入终止状态。
线程优先级
线程优先级决定了线程在多线程环境中的调度顺序。在Java中,线程优先级分为1到10共10个等级,其中1是最低优先级,10是最高优先级。线程的优先级可以通过setPriority()
方法设置,但线程的优先级并不能保证它一定会被优先调度。
守护线程
守护线程是随主线程结束而结束的线程。Java虚拟机中的垃圾回收线程就是一个典型的守护线程。守护线程通常用于执行一些不需要用户交互的后台任务,例如清理工作或监控任务。
线程池
线程池是一种管理线程的机制,它可以提高程序的性能和资源利用率。线程池的核心参数配置包括核心线程数、最大线程数、存活时间、工作队列类型和拒绝策略等。核心线程数是线程池中始终存在的线程数量,最大线程数是线程池允许的最大线程数量,存活时间是空闲线程在终止前可以保持存活的时间,工作队列类型决定了等待执行的任务如何存储,拒绝策略则决定了当线程池达到最大线程数时如何处理新提交的任务。
拒绝策略
当线程池中的线程数量达到最大值时,拒绝策略决定了如何处理新提交的任务。常见的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。AbortPolicy表示抛出一个异常来拒绝任务;CallerRunsPolicy表示由调用任务的线程来处理该任务;DiscardPolicy表示丢弃任务并忽略它;DiscardOldestPolicy表示丢弃队列中最旧的任务。
工作队列类型
线程池的工作队列用于存放等待执行的任务。常见的工作队列类型有LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和SynchronousQueue。LinkedBlockingQueue是一个基于链表的阻塞队列,ArrayBlockingQueue是一个基于数组的阻塞队列,PriorityBlockingQueue是一个具有优先级的阻塞队列,SynchronousQueue是一个不存储元素的阻塞队列。
同步机制
同步机制是保证线程安全的重要手段。常见的同步机制包括悲观锁、乐观锁、读写锁、条件变量和并发集合等。悲观锁假设并发冲突一定会发生,因此在操作数据前先加锁;乐观锁假设并发冲突很少发生,因此在操作数据时才加锁。读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。条件变量是一种线程间的通信机制,它可以使得线程在满足特定条件时进行等待或通知。并发集合是专门为并发环境设计的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。
悲观锁/乐观锁
悲观锁和乐观锁是两种处理并发冲突的策略。悲观锁假设并发冲突一定会发生,因此在操作数据前先加锁;乐观锁假设并发冲突很少发生,因此在操作数据时才加锁。悲观锁通常使用synchronized
关键字或ReentrantLock
类实现。乐观锁可以使用Atomic
类中的compareAndSet()
方法实现。
读写锁
读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。读写锁可以提高并发性能,尤其是在读多写少的场景下。在Java中,可以使用ReentrantReadWriteLock
类实现读写锁。
条件变量
条件变量是一种线程间的通信机制,它可以使得线程在满足特定条件时进行等待或通知。在Java中,可以使用Object
类中的wait()
、notify()
和notifyAll()
方法实现条件变量。
并发集合
并发集合是专门为并发环境设计的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。这些集合类内部实现了线程安全的机制,使得多个线程可以并发访问而不必担心数据不一致的问题。
BlockingQueue
BlockingQueue是一种线程安全的队列,它支持生产者-消费者模型。常见的BlockingQueue实现有LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和SynchronousQueue。这些队列内部实现了阻塞机制,使得生产者和消费者可以高效地协作。
并发工具类
并发工具类包括Phaser、Exchanger、FutureTask等,它们提供了更高级的并发编程功能。Phaser是一个共享屏障,用于协调多个线程的执行;Exchanger用于在线程之间交换数据;FutureTask用于异步执行任务并获取结果。
非阻塞算法
非阻塞算法是指在多线程环境中,线程之间不通过锁机制进行同步,而是通过共享内存和原子操作来实现线程间的协作。非阻塞算法可以提高并发性能,但实现起来较为复杂。
CAS原理
CAS(Compare-And-Swap)是一种原子操作,它可以在多线程环境中实现无锁编程。CAS操作包括三个操作数:内存位置、预期值和新值。如果内存位置的值与预期值相等,则将内存位置的值更新为新值。在Java中,可以使用Atomic
类中的compareAndSet()
方法实现CAS操作。
Atomic类
Atomic类是Java并发包中提供的一系列原子操作类,如AtomicInteger、AtomicLong、AtomicReference等。这些类内部实现了原子操作,使得多个线程可以安全地访问共享变量。
无锁队列
无锁队列是一种基于CAS原理实现的线程安全队列,如ConcurrentLinkedQueue。无锁队列内部不使用锁机制,而是通过CAS操作来实现线程间的协作。
并发框架
并发框架是用于简化并发编程的框架,如Netty、Akka和Disruptor等。这些框架提供了高级的并发编程功能,使得开发者可以更轻松地实现并发程序。
Netty线程模型
Netty采用主从多线程模型,即一个Boss线程负责处理连接请求,多个Worker线程负责处理业务逻辑。这种模型可以提高系统的并发性能和可扩展性。
Akka Actor模型
Akka是一个基于Actor模型的并发框架,它将并发编程抽象为消息传递。在Akka中,每个Actor都是一个独立的消息处理器,它可以发送和接收消息。
Disruptor环形缓冲区
Disruptor是一个高性能的并发框架,它使用环形缓冲区来存储数据,并通过CAS操作实现线程间的协作。Disruptor特别适合于高吞吐量、低延迟的场景。
二、MyBatis知识体系
SQL映射
SQL映射是MyBatis的核心功能之一,它将Java对象与数据库表进行映射。SQL映射可以通过XML文件或注解来实现。在XML映射文件中,可以使用<select>
、<insert>
、<update>
和<delete>
标签定义SQL语句。在注解映射中,可以使用@Select
、@Insert
、@Update
和@Delete
注解来指定对应的SQL语句。
注解映射
注解映射是MyBatis提供的一种简化SQL映射的方式,它通过在Java对象上添加注解来指定字段与数据库字段的映射关系。例如,可以使用@Id
注解指定主键字段,使用@Column
注解指定普通字段。
结果集映射
结果集映射是指将数据库查询结果映射到Java对象的过程。MyBatis提供了多种结果集映射方式,如单列映射、多列映射、自定义映射等。单列映射是指将查询结果的单个值映射到Java对象的某个字段;多列映射是指将查询结果的多列值映射到Java对象的多个字段;自定义映射是指通过自定义类型处理器来处理查询结果。
关联查询
关联查询是指查询涉及多个表的数据。MyBatis通过嵌套查询、关联映射和延迟加载等方式实现关联查询。嵌套查询是指通过查询子查询来实现关联查询;关联映射是指通过映射关系来关联不同的表;延迟加载是指在实际需要数据时才进行加载。
动态SQL
动态SQL是指根据不同的条件生成不同的SQL语句。MyBatis提供了动态SQL标签,如<if>
、<choose>
、<foreach>
等。这些标签可以根据条件动态地添加或删除SQL语句的一部分。
OGNL表达式
OGNL(Object-Graph Navigation Language)是一种表达式语言,它用于在MyBatis中动态生成SQL语句。OGNL表达式可以用于动态生成SQL语句中的条件、值等部分。
分支语句
分支语句是指根据不同的条件执行不同的SQL语句。MyBatis通过动态SQL标签实现分支语句。例如,可以使用<if>
标签来根据条件判断是否执行某些SQL语句。
批量操作
批量操作是指同时执行多个SQL语句。MyBatis提供了批量操作的支持,如<foreach>
标签。批量操作可以提高数据库的执行效率。
缓存机制
MyBatis提供了缓存机制,包括一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,它缓存了SqlSession中最近执行过的SQL语句及其结果。二级缓存是Mapper级别的缓存,它缓存了Mapper中最近执行过的SQL语句及其结果。
一级缓存
一级缓存是SqlSession级别的缓存,它缓存了SqlSession中最近执行过的SQL语句及其结果。当执行查询操作时,MyBatis会首先检查一级缓存中是否存在相应的结果,如果存在则直接返回结果,否则执行SQL语句并将结果存入一级缓存。
二级缓存
二级缓存是Mapper级别的缓存,它缓存了Mapper中最近执行过的SQL语句及其结果。当执行查询操作时,MyBatis会首先检查二级缓存中是否存在相应的结果,如果存在则直接返回结果,否则执行SQL语句并将结果存入二级缓存。
自定义缓存
MyBatis允许用户自定义缓存,通过实现Cache接口来实现。自定义缓存可以根据具体需求进行定制,例如缓存数据的过期策略、淘汰策略等。
代理模式
MyBatis使用代理模式来实现Mapper接口的动态代理,从而实现动态代理执行流程。当调用Mapper接口的方法时,MyBatis会创建一个代理对象来执行相应的SQL语句。
MapperProxy
MapperProxy是MyBatis中用于实现动态代理的类。它通过代理模式拦截对Mapper接口的调用,并将调用转换为对SQL语句的执行。
插件拦截
MyBatis允许用户自定义插件,通过拦截执行流程来实现自定义功能。插件可以拦截SQL语句的执行、结果集的处理等环节,从而实现自定义的逻辑。
动态代理执行流程
MyBatis的动态代理执行流程包括:代理对象调用方法、代理对象执行方法、代理对象返回结果。当调用Mapper接口的方法时,MyBatis会创建一个代理对象来执行相应的SQL语句。代理对象在执行方法时会拦截调用,并转换为对SQL语句的执行。执行完成后,代理对象返回结果。
SqlSession生命周期
SqlSession是MyBatis的核心对象,它负责执行SQL语句。SqlSession的生命周期包括创建、使用和关闭。在创建SqlSession时,MyBatis会初始化数据库连接、事务管理器等资源。在使
📥博主的人生感悟和目标

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

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