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

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

一、并发编程知识体系
并发编程是现代计算机系统中的关键技术,它允许系统同时处理多个任务,提高资源利用率和系统响应速度。以下是对并发编程核心知识点的详细阐述。
线程基础
线程是程序执行的最小单元,是并发编程的基础。在多核处理器和分布式系统中,线程能够有效利用资源,提高程序执行效率。
线程生命周期:线程从创建到销毁会经历多个状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程状态之间的转换遵循一定的规则,例如,线程从就绪状态变为运行状态需要线程调度器的选择,而从运行状态变为阻塞状态可能是因为线程执行了等待操作或被其他线程阻塞。
线程优先级:线程优先级决定了线程的调度顺序,Java中线程优先级分为1到10,优先级高的线程有更高的执行机会。线程优先级会影响线程调度器的工作,但优先级调度策略并不是完全公平的,因为线程优先级可以动态调整。
守护线程:守护线程是服务其他线程的线程,当所有非守护线程结束时,JVM会自动结束。守护线程通常用于执行一些不需要用户交互的后台任务,如垃圾回收、日志记录等。
线程池:线程池管理一组线程,用于执行多个任务。线程池可以提高应用程序的性能,因为它避免了频繁创建和销毁线程的开销。线程池的核心参数配置包括核心线程数、最大线程数、存活时间、任务队列和拒绝策略。
核心参数配置:线程池的核心线程数决定了在空闲时线程池保留的线程数量,最大线程数决定了线程池能够创建的最大线程数量。存活时间是指线程池中空闲线程等待超时的时间,任务队列用于存放等待执行的任务,拒绝策略决定了当线程池无法执行更多任务时如何处理新提交的任务。
拒绝策略:常见的拒绝策略包括AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行)、DiscardPolicy(丢弃任务)和DiscardOldestPolicy(丢弃最早的任务)。
工作队列类型:工作队列用于存放等待执行的任务,常见的队列类型有同步队列、链表和阻塞队列。同步队列保证了任务按顺序执行,链表队列提供了较高的吞吐量,阻塞队列支持生产者和消费者之间的线程协作。
同步机制
同步机制确保了多个线程访问共享资源时的正确性,防止数据竞争和资源不一致。
悲观锁/乐观锁:悲观锁假设并发冲突很频繁,因此会锁定资源直到事务完成;乐观锁假设并发冲突很少,通过版本号或时间戳检测冲突。悲观锁通常使用synchronized关键字或Lock接口实现,乐观锁可以使用CAS(Compare-And-Swap)算法实现。
读写锁:读写锁允许多个线程同时读取资源,但写入时需要独占锁。读写锁可以提高读操作的并发性,适用于读多写少的场景。读写锁可以使用ReentrantReadWriteLock实现。
条件变量:条件变量允许线程在某个条件不满足时等待,直到条件满足时被唤醒。条件变量通常与Lock接口结合使用,例如ReentrantLock的newCondition方法。
并发集合
并发集合是为了在多线程环境中安全地操作集合而设计的,常见的并发集合包括ConcurrentHashMap、CopyOnWriteArrayList和BlockingQueue等。
ConcurrentHashMap:ConcurrentHashMap是线程安全的HashMap,提供了高效的并发访问。它采用分段锁(Segment Locking)机制,将数据分为多个段,每个段使用独立的锁,从而提高了并发性能。
CopyOnWrite容器:CopyOnWrite容器在写操作时复制底层数组,读操作时访问复制的数组,适用于读多写少的场景。CopyOnWriteArrayList和CopyOnWriteArraySet是常见的CopyOnWrite容器。
BlockingQueue:BlockingQueue是阻塞队列,当队列满时,生产者线程会等待;当队列空时,消费者线程会等待。BlockingQueue提供了丰富的操作方法,如put、take、offer、poll等。
并发工具类
一些并发工具类可以帮助我们更方便地进行并发编程,例如Phaser、Exchanger、FutureTask和非阻塞算法等。
Phaser:Phaser用于协调一组线程的执行顺序。它允许线程在执行过程中加入或退出,并等待其他线程完成。Phaser适用于需要多个线程协同完成任务的场景。
Exchanger:Exchanger允许两个线程交换数据。它通常用于线程之间的数据交换,例如生产者-消费者模型。
FutureTask:FutureTask表示异步计算的结果。它允许我们提交一个任务,并获取任务执行的结果。
非阻塞算法:非阻塞算法避免了线程间的等待,提高了程序的响应速度。非阻塞算法通常使用CAS算法实现。
CAS原理与Atomic类
CAS(Compare-And-Swap)是一种无锁算法,用于实现原子操作。它通过比较内存中的值与预期值,如果相等则将内存中的值更新为新的值。
Atomic类:Java提供了Atomic类,如AtomicInteger、AtomicLong等,用于实现原子操作。这些类基于CAS算法实现,提供了线程安全的原子操作。
并发框架
一些并发框架提供了更高层次的抽象,帮助开发者进行并发编程,例如Netty、Akka和Disruptor等。
Netty线程模型:Netty使用主从多线程模型,一个Boss线程负责处理连接请求,多个Worker线程负责处理读写操作。这种模型可以有效地处理高并发网络请求。
Akka Actor模型:Akka使用Actor模型,每个Actor独立运行,通过消息传递进行通信。Actor模型具有高可用性和容错性,适用于构建分布式系统。
Disruptor环形缓冲区:Disruptor使用环形缓冲区,通过环形数组来存储数据,减少了内存分配和回收的开销。Disruptor适用于高并发场景,如消息队列和事件处理。
二、MyBatis知识体系
MyBatis是一个优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程。
SQL映射
MyBatis通过XML或注解的方式将SQL语句与Java对象进行映射。
注解映射:使用@Select、@Insert、@Update、@Delete等注解来定义SQL语句。注解映射简化了SQL语句的定义,提高了代码的可读性和可维护性。
结果集映射:将SQL查询结果映射到Java对象或Map。MyBatis使用OGNL表达式进行结果集映射,支持复杂的映射关系。
关联查询映射:处理多表关联查询,将结果映射到嵌套的Java对象。MyBatis支持多种关联查询映射方式,如一对一、一对多、多对多等。
动态SQL:使用 、 、 等标签来构建动态SQL语句。动态SQL可以根据条件动态生成SQL语句,提高了代码的灵活性和可维护性。
OGNL表达式与分支语句
OGNL(Object-Graph Navigation Language)表达式用于在MyBatis中进行复杂的表达式计算。
OGNL表达式:在MyBatis中使用OGNL表达式访问对象的属性和执行方法。OGNL表达式支持丰富的操作符和函数,如比较、算术、逻辑等。
分支语句:在动态SQL中使用分支语句来实现条件逻辑。分支语句包括 、 、 、 等标签,可以灵活地构建条件逻辑。
批量操作与缓存机制
MyBatis支持批量操作和缓存机制,提高了数据库操作的性能。
批量操作:MyBatis支持批量插入和批量更新操作。批量操作可以减少数据库访问次数,提高数据库操作效率。
缓存机制:
- 一级缓存:SqlSession级别的缓存,用于缓存SQL语句及其结果。一级缓存可以减少数据库访问次数,提高查询性能。
- 二级缓存:Mapper级别的缓存,用于缓存特定Mapper的查询结果。二级缓存可以跨SqlSession共享数据,提高查询性能。
- 自定义缓存:自定义缓存实现,可以扩展MyBatis的缓存机制。自定义缓存可以实现更复杂的缓存策略,如缓存失效、缓存淘汰等。
- 代理模式:使用代理模式实现缓存的读写操作。代理模式可以隐藏缓存实现细节,提高代码的可读性和可维护性。
MapperProxy与插件拦截
MyBatis使用动态代理技术生成Mapper接口的代理实现。
MapperProxy:MyBatis使用动态代理技术生成Mapper接口的代理实现。代理实现封装了数据库操作,简化了数据库操作代码。
插件拦截:MyBatis允许通过插件拦截SQL执行过程,例如查询拦截、更新拦截等。插件拦截可以用于实现自定义的功能,如日志记录、性能监控等。
SqlSession生命周期与执行器类型
SqlSession是MyBatis的核心接口,负责执行SQL语句、管理事务等。
SqlSession生命周期:SqlSession生命周期包括创建、使用和关闭三个阶段。创建SqlSession可以使用SqlSessionFactoryBuilder或SqlSessionFactory。使用SqlSession执行SQL语句、管理事务等。关闭SqlSession释放资源。
执行器类型:MyBatis提供多种执行器类型,如SimpleExecutor、ReuseExecutor、BatchExecutor等,用于执行SQL语句。
- SimpleExecutor:简单执行器,每次执行SQL语句都创建新的Statement对象。
- ReuseExecutor:重用执行器,重用Statement对象,减少了数据库连接和Statement创建的开销。
- BatchExecutor:批量执行器,支持批量插入和批量更新操作,减少了数据库访问次数。
延迟加载与扩展机制
MyBatis支持延迟加载关联对象,降低内存消耗。
延迟加载:MyBatis支持延迟加载关联对象,即在需要时才加载关联对象。延迟加载可以降低内存消耗,提高查询性能。
扩展机制:MyBatis提供多种扩展机制,如自定义类型处理器、拦截器链、方言支持等。
- 自定义类型处理器:自定义类型处理器可以将数据库数据类型转换为Java对象类型。
- 拦截器链:拦截器链可以拦截SQL执行过程,例如查询拦截、更新拦截等。
- 方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle、SQL Server等。
总结
本文详细介绍了并发编程和MyBatis的核心知识点,通过串联多个知识点,使读者能够举一反三,更好地理解和应用这些技术。在实际开发中,掌握并发编程和MyBatis对于提高应用程序的性能和可维护性具有重要意义。
📥博主的人生感悟和目标

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

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