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

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

【一、并发编程知识体系】
线程基础
-
线程生命周期:线程的创建与销毁是并发编程中的基础操作。在Java中,线程的生命周期可以通过Thread类及其内部枚举Thread.State来管理。线程状态包括新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)。线程状态的转换依赖于线程调度策略和线程间的交互。例如,一个线程在执行过程中可能会因为等待某个锁而进入BLOCKED状态,当锁被释放后,线程可能会进入RUNNABLE状态再次参与调度。
-
线程优先级:线程优先级在Java中通过Thread类中的getPriority()和setPriority()方法进行设置。线程优先级是基于操作系统的线程调度策略,不同操作系统对线程优先级的处理可能有所不同。在Java中,线程优先级分为10个等级,从最低的1到最高的10,优先级高的线程在调度时具有更高的优先级。
-
守护线程:守护线程(Daemon Thread)是一种特殊的线程,它始终在后台运行,为其他线程提供服务。当没有非守护线程在运行时,守护线程也会自动结束。在Java中,可以通过调用Thread.setDaemon(true)将线程设置为守护线程。
-
线程池:线程池是一种高效管理线程的工具,它通过限制并复用线程来提高应用程序的响应速度和吞吐量。线程池的核心参数包括核心线程数、最大线程数、线程存活时间、工作队列类型等。在Java中,可以使用Executors工厂类来创建不同类型的线程池。
-
拒绝策略:当线程池达到最大线程数时,如何处理新提交的任务是线程池管理中的一个关键问题。拒绝策略包括AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。例如,AbortPolicy策略会在达到最大线程数时抛出RejectedExecutionException异常。
-
工作队列类型:线程池的工作队列用于存放等待执行的任务。常见的工作队列类型包括LinkedBlockingQueue、ArrayBlockingQueue和SynchronousQueue。每种队列类型都有其特定的性能特点和适用场景。
-
同步机制:同步机制是保证线程安全的关键。在Java中,synchronized关键字和ReentrantLock等锁机制可以用来实现同步。悲观锁和乐观锁是两种常见的同步策略。悲观锁假设数据在访问过程中会被修改,因此需要加锁;乐观锁则假设数据在访问过程中不会被修改,只在操作时进行版本号检查。
-
并发集合:Java并发包(java.util.concurrent)提供了一系列线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。这些集合类利用了分段锁、原子操作等技术,实现了高效的并发访问。
-
并发工具类:Phaser、Exchanger、FutureTask等工具类提供了并发编程中常用的功能。例如,Phaser可以协调多个线程的执行顺序,Exchanger用于在线程间交换数据,FutureTask用于异步执行任务。
-
非阻塞算法:非阻塞算法如CAS(Compare-And-Swap)原理、Atomic类、无锁队列等可以提高并发性能。这些算法利用了硬件级别的原子操作,避免了锁的开销。
-
并发框架:Netty、Akka、Disruptor等并发框架提供了丰富的并发编程功能。例如,Netty采用主从多线程模型,Akka基于Actor模型,Disruptor基于环形缓冲区。
【二、MyBatis知识体系】
SQL映射
-
注解映射:MyBatis使用注解来简化SQL语句和Java对象之间的映射关系。例如,@Select、@Insert、@Update、@Delete等注解可以用来定义SQL语句。
-
结果集映射:MyBatis通过ResultMap将SQL查询结果映射到Java对象中。ResultMap定义了列名与Java对象属性之间的映射关系。
-
关联查询:MyBatis支持关联查询,通过@One、@Many等注解可以定义多表之间的关联关系。
-
动态SQL:MyBatis支持动态SQL,通过Ognl表达式和 、 、 等标签可以构建动态SQL语句。
-
OGNL表达式:OGNL(Object-Graph Navigation Language)表达式用于动态获取Java对象属性值。OGNL表达式可以访问对象的属性、方法、集合等。
-
分支语句:MyBatis支持分支语句,通过 、 等标签可以根据条件执行不同的SQL语句。
-
批量操作:MyBatis支持批量操作,通过 标签可以执行批量插入、更新、删除等操作。
缓存机制
-
一级缓存:MyBatis在SqlSession级别提供一级缓存,用于缓存查询结果。一级缓存的作用域是SqlSession,当SqlSession关闭时,一级缓存也会被清空。
-
二级缓存:MyBatis支持自定义二级缓存,通过实现Cache接口可以定义缓存策略。二级缓存的作用域是全局的,多个SqlSession可以共享二级缓存。
-
自定义缓存:通过实现Cache接口,可以自定义缓存策略,例如,实现缓存数据的加载、更新、删除等操作。
-
代理模式:MyBatis使用代理模式来实现延迟加载。当访问一个对象时,如果该对象尚未被加载,代理会负责加载对象并将其缓存起来。
MapperProxy插件拦截动态代理执行流程
-
MapperProxy:MyBatis使用MapperProxy代理Mapper接口,实现动态代理。当调用Mapper接口的方法时,实际上是通过代理对象来执行。
-
插件拦截:MyBatis支持插件拦截,通过实现Interceptor接口可以自定义拦截逻辑。插件可以拦截执行器、事务管理器、SqlSession等。
-
动态代理执行流程:MyBatis通过动态代理,将Mapper接口的方法调用转换为数据库操作。在执行过程中,插件可以拦截并修改数据库操作。
SqlSession生命周期
-
SqlSession:MyBatis的SqlSession负责管理数据库连接、事务等。SqlSession是MyBatis的核心对象,它提供了数据库操作的方法。
-
执行器类型:MyBatis提供多种执行器类型,如SimpleExecutor、BatchExecutor、ReuseExecutor等。不同的执行器类型适用于不同的场景。
-
延迟加载:MyBatis支持延迟加载,通过@Lazy注解可以定义延迟加载策略。
-
扩展机制:MyBatis提供扩展机制,如自定义类型处理器、拦截器链、方言支持等。这些扩展机制可以增强MyBatis的功能。
📥博主的人生感悟和目标

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

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