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

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

一、并发编程知识体系
线程基础 线程是并发编程的核心概念,它允许程序在单个进程中同时执行多个任务。在操作系统中,线程是CPU调度的基本单位,它通过共享进程的资源(如内存、文件描述符等)来实现多任务处理。线程的创建通常涉及操作系统内核的调度,而线程的运行则依赖于CPU的时间片分配。
线程生命周期 线程从创建到销毁经历多个状态,这些状态反映了线程的执行状态。在Java中,线程的生命周期可以概括为以下状态:
- 新建(New):线程对象被创建但尚未启动。
- 就绪(Runnable):线程已经准备好执行,等待CPU调度。
- 运行(Running):线程正在CPU上执行。
- 阻塞(Blocked):线程因为某些原因(如等待资源)无法继续执行。
- 等待(Waiting):线程在等待某个条件发生,如等待另一个线程的通知。
- 超时等待(Timed Waiting):线程在等待某个条件发生,但有一个超时限制。
- 终止(Terminated):线程执行完毕或被终止。
线程优先级 线程优先级决定了线程在调度时的优先级。在Java中,线程优先级用整数表示,数值越大,优先级越高。线程优先级在调度时只是一个建议,操作系统可以根据实际情况进行调整。
守护线程 守护线程是一种特殊的线程,它依赖于其他线程的执行。当所有非守护线程结束时,守护线程也会自动结束。在Java中,可以使用setDaemon(true)
方法将线程设置为守护线程。
线程池 线程池是管理一组线程的集合,它允许程序重用一组线程来执行多个任务,从而减少线程创建和销毁的开销。线程池的核心参数包括:
- 核心线程数:线程池中始终存在的线程数量。
- 最大线程数:线程池允许的最大线程数量。
- 线程活跃时间:线程池中空闲线程的存活时间。
- 任务队列类型:线程池中用于存放待执行任务的队列类型。
- 拒绝策略:当线程池达到最大线程数时,如何处理无法执行的任务。
拒绝策略 当线程池达到最大线程数时,如果还有任务需要执行,拒绝策略决定如何处理这些任务。常见的拒绝策略包括:
- CallerRunsPolicy:调用者运行策略,将任务回退给调用者线程执行。
- AbortPolicy:抛出异常,通知调用者线程池已满。
- DiscardPolicy:丢弃任务,不采取任何行动。
- DiscardOldestPolicy:丢弃队列中最旧的未执行任务。
工作队列类型 线程池的工作队列用于存放待执行的任务。常见的队列类型包括:
- LinkedBlockingQueue:基于链表的阻塞队列,适用于生产者-消费者模型。
- ArrayBlockingQueue:基于数组的阻塞队列,具有固定容量。
- PriorityBlockingQueue:具有优先级的阻塞队列。
- SynchronousQueue:不存储元素的阻塞队列,每个插入操作必须等待另一个线程的删除操作。
同步机制 同步机制用于保证线程在访问共享资源时的互斥性,防止数据竞争。常见的同步机制包括:
- 互斥锁(Mutex):确保一次只有一个线程可以访问共享资源。
- 读写锁(ReadWriteLock):允许多个线程同时读取共享资源,但只有一个线程可以写入。
- 条件变量(Condition):允许线程在某些条件成立之前阻塞。
悲观锁/乐观锁 悲观锁和乐观锁是两种不同的并发控制策略。悲观锁假设并发冲突很可能会发生,因此在访问共享资源时总是先加锁;乐观锁则假设并发冲突很少发生,只有在冲突发生时才进行锁的申请。
读写锁 读写锁是一种高级的同步机制,允许多个线程同时读取共享资源,但只有一个线程可以写入共享资源。在Java中,ReentrantReadWriteLock
类提供了读写锁的实现。
条件变量 条件变量是一种线程间的通信机制,允许线程在满足某些条件之前阻塞,直到其他线程通知它。在Java中,Object
类提供了wait()
、notify()
和notifyAll()
方法来实现条件变量。
并发集合 并发集合是专门为并发环境设计的集合类,如ConcurrentHashMap
、CopyOnWriteArrayList
等。这些集合类提供了线程安全的操作,确保在并发访问时数据的一致性。
CopyOnWrite容器 CopyOnWrite容器是一种线程安全的集合,在每次修改操作时都会创建一个新的副本,而不是直接修改原有对象。这种策略适用于读多写少的场景。
BlockingQueue BlockingQueue
是一种线程安全的队列,支持阻塞式操作,包括插入、删除和检查元素。它常用于生产者-消费者模型,确保线程之间的协调。
并发工具类 并发工具类提供了各种并发编程中的实用工具,如Phaser
、Exchanger
、FutureTask
等。这些工具类简化了并发编程的复杂性。
非阻塞算法 非阻塞算法是一种避免使用锁的并发控制方法,通过原子操作和条件变量实现。这种策略可以减少锁的竞争,提高系统的吞吐量。
CAS原理 CAS(Compare-And-Swap)是一种非阻塞算法,通过比较内存中的值和预期值,如果相等则更新内存中的值。在Java中,java.util.concurrent.atomic
包提供了原子操作类。
Atomic类 Atomic
类提供了一系列原子操作的工具类,如AtomicInteger
、AtomicLong
、AtomicReference
等。这些类可以保证在多线程环境下对基本数据类型的操作是原子的。
无锁队列 无锁队列是一种不使用锁的并发队列,通过CAS操作实现线程安全。这种队列适用于高并发场景,可以显著提高系统的性能。
并发框架 并发框架提供了一系列并发编程的工具和库,如Netty、Akka、Disruptor等。这些框架简化了并发编程的复杂性,提供了高性能的并发解决方案。
Netty线程模型 Netty是一种高性能的网络框架,其线程模型采用主从多线程模型,将任务分配给多个线程进行处理。这种模型可以有效地提高网络应用程序的并发性能。
Akka Actor模型 Akka是一种基于Actor模型的并发框架,通过Actor之间的消息传递实现并发编程。Actor模型提供了一种轻量级的并发解决方案,可以简化并发编程的复杂性。
Disruptor环形缓冲区 Disruptor是一种高性能的并发框架,使用环形缓冲区来存储数据,并通过发布-订阅模式实现并发访问。这种框架特别适用于处理高并发的事件处理场景。
二、MyBatis知识体系
SQL映射 SQL映射是将Java对象属性与数据库表字段之间的映射关系。在MyBatis中,SQL映射可以通过注解和XML两种方式进行定义。
注解映射 注解映射使用MyBatis提供的注解,如@Select
、@Insert
、@Update
、@Delete
等,来定义SQL映射关系。这些注解可以直接应用于接口方法或XML映射文件中的SQL语句。
结果集映射 结果集映射是将数据库查询结果与Java对象属性之间的映射关系。在MyBatis中,可以使用@Results
和@Result
注解来实现结果集映射。
关联查询 关联查询用于处理多表之间的关系。在MyBatis中,可以使用@One
和@Many
注解来实现关联查询。
动态SQL 动态SQL允许根据不同的条件动态生成SQL语句。在MyBatis中,可以使用@SelectProvider
、@SelectKey
和@Options
等注解来实现动态SQL。
OGNL表达式 OGNL(Object-Graph Navigation Language)是一种表达式语言,用于在MyBatis中实现复杂的表达式和逻辑。OGNL表达式可以用于动态SQL映射和结果集映射。
分支语句 分支语句允许根据不同的条件执行不同的SQL语句。在MyBatis中,可以使用<choose>
、<when>
和<otherwise>
标签来实现分支语句。
批量操作 批量操作允许一次性执行多个SQL语句,提高数据库操作的效率。在MyBatis中,可以使用<foreach>
标签来实现批量操作。
缓存机制 MyBatis提供了两种缓存机制:一级缓存和二级缓存。
一级缓存 一级缓存是MyBatis的默认缓存,用于缓存SqlSession范围内的查询结果。当执行查询操作时,MyBatis会首先检查一级缓存中是否存在该数据,如果存在则直接返回结果,否则从数据库中查询并缓存结果。
二级缓存 二级缓存是MyBatis提供的跨SqlSession的缓存机制,用于缓存应用级别的查询结果。二级缓存可以跨多个SqlSession共享,但需要手动配置和管理。
自定义缓存 MyBatis允许自定义缓存实现,通过实现Cache
接口来实现自定义缓存。自定义缓存可以提供更灵活的缓存策略和更丰富的功能。
代理模式 MyBatis使用代理模式来管理Mapper接口和实现类之间的关系。通过代理模式,MyBatis可以在不修改原始接口的情况下,动态地生成代理实现类。
MapperProxy MapperProxy
是MyBatis中用于代理Mapper接口的类,负责执行SQL语句。当调用Mapper接口的方法时,MapperProxy
会拦截这个调用,并执行相应的SQL语句。
插件拦截 MyBatis提供了插件机制,允许拦截SQL执行过程,如执行器、类型处理器、拦截器链等。通过插件机制,可以扩展MyBatis的功能,实现自定义的拦截逻辑。
动态代理执行流程 MyBatis使用动态代理技术来代理Mapper接口,执行流程包括代理生成、代理执行和结果返回。在代理生成阶段,MyBatis会动态生成代理实现类;在代理执行阶段,代理实现类会拦截调用并执行相应的SQL语句;在结果返回阶段,代理实现类会将执行结果返回给调用者。
SqlSession生命周期 SqlSession
是MyBatis的核心对象,负责管理数据库连接和事务。SqlSession
的生命周期包括创建、使用和关闭。在创建SqlSession
时,MyBatis会建立数据库连接并开启事务;在使用SqlSession
时,可以执行SQL语句和进行数据操作;在关闭SqlSession
时,MyBatis会提交或回滚事务并关闭数据库连接。
执行器类型 MyBatis提供了多种执行器类型,如SimpleExecutor
、ReuseExecutor
和BatchExecutor
,用于执行SQL语句。不同的执行器类型适用于不同的场景,例如SimpleExecutor
适用于单条SQL语句的执行,而BatchExecutor
适用于批量操作。
延迟加载 延迟加载是一种懒加载技术,用于按需加载对象属性。在MyBatis中,可以使用<association>
和<collection>
标签来实现延迟加载。
扩展机制 MyBatis提供了扩展机制,允许自定义插件、拦截器、执行器等。通过扩展机制,可以扩展MyBatis的功能,实现自定义的插件逻辑。
类型处理器 类型处理器用于将数据库字段类型转换为Java对象属性类型。在MyBatis中,类型处理器通过实现TypeHandler
接口来实现。
拦截器链 拦截器链是一种拦截器管理机制,允许在执行SQL语句前和后执行拦截器。在MyBatis中,拦截器链通过实现Interceptor
接口来实现。
方言支持 MyBatis支持多种数据库方言,如MySQL、Oracle、SQL Server等,通过方言可以自定义SQL语句的语法。在MyBatis中,可以通过配置文件或注解来指定使用哪种方言。
总结 本文详细介绍了并发编程和MyBatis知识体系,从线程基础、线程池、同步机制、并发集合到并发框架,再到MyBatis的SQL映射、动态SQL、缓存机制、插件拦截等。通过串联这些知识点,我们可以更好地理解和应用并发编程和MyBatis技术。在实际开发中,我们需要根据具体场景选择合适的并发编程模型和MyBatis配置,以提高应用性能和可维护性。
📥博主的人生感悟和目标

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

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