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

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

一、并发编程知识体系
-
线程基础 线程是操作系统进行任务调度的基本单位,是执行程序代码的实体。线程模型相较于进程模型更加轻量级,因为线程共享进程的资源,如内存空间、文件句柄等。线程的创建和管理是并发编程的核心内容。线程的堆栈和局部变量为其提供了独立的运行环境,使得线程之间可以并行执行。
-
线程生命周期 线程从创建到销毁,经历以下状态转换:
- 新建状态(New):线程对象创建完成,但尚未启动。
- 可运行状态(Runnable):线程已准备好执行,等待被调度。
- 运行状态(Running):线程正在执行CPU时间片。
- 阻塞状态(Blocked):线程因等待某个条件(如I/O操作、锁)而无法执行。
- 等待状态(Waiting):线程在等待某个特定条件成立。
- 超时等待状态(Timed Waiting):线程在等待特定条件成立,并设置超时时间。
- 终止状态(Terminated):线程执行完毕或被其他线程中断。
-
线程优先级 线程优先级影响线程的执行顺序,优先级高的线程获得CPU时间片的机会更多。Java中线程优先级分为五个等级,从低到高分别为:最低优先级(MIN_PRIORITY)、较低优先级(LOWER_PRIORITY)、正常优先级(NORM_PRIORITY)、较高优先级(HIGHER_PRIORITY)和最高优先级(MAX_PRIORITY)。
-
守护线程 守护线程(Daemon Thread)是随应用程序一起结束的线程。当所有非守护线程结束时,程序也会随之结束。守护线程常用于执行后台任务,如垃圾回收。
-
线程池 线程池是一组预先创建并等待处理的线程,可以提高程序执行效率。线程池通过以下参数进行配置:
- 核心线程数(corePoolSize):线程池维护的基本线程数量。
- 最大线程数(maximumPoolSize):线程池能容纳的最大线程数。
- 线程空闲存活时间(keepAliveTime):当线程数超过核心线程数时,多余的线程等待的时间。
- 工作队列(workQueue):用于存放等待执行的任务队列。
- 拒绝策略(RejectedExecutionHandler):当任务队列已满,线程池无法处理更多任务时的处理策略。
-
拒绝策略 线程池拒绝策略包括以下几种:
- AbortPolicy:抛出RejectedExecutionException异常。
- CallerRunsPolicy:调用者线程执行任务。
- DiscardPolicy:直接丢弃任务。
- DiscardOldestPolicy:丢弃队列中最早的未处理任务。
- ThreadPoolExecutor.CallerRunsPolicy:与CallerRunsPolicy相同。
-
工作队列类型 工作队列类型包括以下几种:
- LinkedBlockingQueue:基于链表的阻塞队列,具有无界特性。
- ArrayBlockingQueue:基于数组的阻塞队列,具有有界特性。
- PriorityBlockingQueue:具有优先级的阻塞队列。
- SynchronousQueue:无容量队列,主要用于构建生产者-消费者模型。
-
同步机制 同步机制包括以下几种:
- 互斥锁(Mutex):保证在同一时刻只有一个线程能够访问共享资源。
- 信号量(Semaphore):允许多个线程访问有限资源,用于实现多线程之间的同步。
- 条件变量(Condition):线程在满足特定条件时等待,等待条件成立后继续执行。
- 读写锁(ReadWriteLock):允许多个线程同时读取数据,但只有一个线程能够修改数据。
-
悲观锁/乐观锁 悲观锁和乐观锁是两种解决并发数据一致性的方法。
- 悲观锁:假设并发过程中一定会发生冲突,采用加锁机制确保数据一致性。
- 乐观锁:假设并发过程中很少发生冲突,通过版本号或时间戳检测数据冲突,无需加锁。
-
读写锁 读写锁是一种高级并发控制机制,允许多个线程同时读取数据,但只有一个线程能够修改数据。
- 读锁(ReadLock):允许多个线程同时获取读锁,但不会释放读锁。
- 写锁(WriteLock):只有一个线程可以获取写锁,其他线程必须等待写锁释放。
-
条件变量 条件变量是一种高级并发控制机制,允许线程在满足特定条件时等待,等待条件成立后继续执行。
- wait():线程等待特定条件成立,释放当前线程持有的锁。
- notify():唤醒一个在特定条件上等待的线程。
- notifyAll():唤醒所有在特定条件上等待的线程。
-
并发集合 并发集合是一组支持并发操作的集合类,包括以下几种:
- CopyOnWriteArrayList:写操作时复制原数组,读操作直接操作新数组。
- ConcurrentHashMap:线程安全的HashMap,支持并发操作。
- ConcurrentLinkedQueue:线程安全的无界队列。
- ConcurrentSkipListMap:线程安全的有序映射。
- CopyOnWriteArraySet:线程安全的无界集合。
-
ConcurrentHashMap ConcurrentHashMap是Java提供的一个线程安全的HashMap实现,具有以下特点:
- 内部采用分段锁技术:将数据分成多个段,每个段有自己的锁,降低锁竞争。
- 读写操作采用分段锁:读写操作分别对应不同的锁,降低锁竞争。
- 迭代器在遍历过程中不会抛出ConcurrentModificationException异常。
-
CopyOnWrite容器 CopyOnWrite容器是一种线程安全的集合类,具有以下特点:
- 读操作时直接返回数据的副本:避免读写冲突。
- 写操作时复制原数据:提高并发性能。
- 适用于读操作远多于写操作的场景。
-
BlockingQueue BlockingQueue是一种线程安全的队列,具有以下特点:
- 线程安全的入队和出队操作。
- 支持阻塞和非阻塞的入队和出队操作。
- 可用于生产者-消费者模型。
-
并发工具类 并发工具类包括以下几种:
- CountDownLatch:计数器,当计数器减到0时,阻塞的线程可以继续执行。
- CyclicBarrier:循环屏障,多个线程等待某个条件成立后继续执行。
- Phaser:分区栅栏,支持动态增加线程的并发控制。
- Exchanger:线程间交换数据的同步点。
-
FutureTask FutureTask是实现Future接口的类,用于异步执行任务,具有以下特点:
- 可以获取异步执行任务的结果。
- 可以取消任务执行。
- 可以检查任务是否完成。
-
非阻塞算法 非阻塞算法是一种在多线程环境中避免锁竞争的算法,如CAS算法(Compare-And-Swap)。
-
CAS原理 CAS算法是一种非阻塞算法,包括以下三个操作:
- V:内存中当前值。
- A:预期值。
- B:新值。 当且仅当V等于A时,将V设置为B,否则不改变V的值。
-
Atomic类 Atomic类是一组原子操作类,提供无锁并发编程支持,包括以下几种:
- AtomicInteger:原子操作整数。
- AtomicLong:原子操作长整型。
- AtomicReference:原子操作引用。
-
无锁队列 无锁队列是一种不使用锁的队列实现,具有以下特点:
- 适用于低并发场景。
- 提高线程性能。
-
并发框架 并发框架是一组用于处理并发问题的工具和库,包括以下几种:
- Netty:高性能的NIO框架,适用于网络编程。
- Akka:Actor模型实现的高性能并发框架。
- Disruptor:环形缓冲区实现的高性能并发框架。
二、MyBatis知识体系
-
SQL映射 SQL映射是将Java对象属性与数据库表字段进行映射的过程。MyBatis通过以下方式实现SQL映射:
- XML配置:通过XML文件定义SQL映射关系。
- 注解映射:通过Java注解实现SQL映射。
-
注解映射 MyBatis提供的注解映射包括以下几种:
- @Select:用于定义查询SQL。
- @Insert:用于定义插入SQL。
- @Update:用于定义更新SQL。
- @Delete:用于定义删除SQL。
-
结果集映射 结果集映射将查询结果映射到Java对象中,包括以下几种方式:
- 自动映射:MyBatis会根据Java对象属性名和数据库表字段名进行映射。
- 自定义映射:通过@Result或 元素定义自定义映射关系。
-
关联查询 关联查询用于查询数据库中多个表之间的关系,包括以下几种方式:
- 一对一关联查询:使用 或@One注解定义关联关系。
- 一对多关联查询:使用 或@Many注解定义关联关系。
-
动态SQL 动态SQL允许在运行时根据条件动态构建SQL语句,MyBatis提供以下几种动态SQL技术:
- :根据条件判断是否执行SQL片段。
- 、 、 :类似于Java中的switch语句。
- :用于循环遍历集合,构建SQL片段。
-
OGNL表达式 OGNL(Object-Graph Navigation Language)是一种表达式语言,用于访问对象属性和集合元素。MyBatis支持OGNL表达式,用于动态SQL和结果集映射。
-
分支语句 分支语句用于在动态SQL中根据条件选择执行不同的SQL片段,包括以下几种:
- 、 、 :类似于Java中的switch语句。
- :根据条件判断是否执行SQL片段。
-
批量操作 批量操作允许一次性执行多条SQL语句,包括以下几种方式:
- :用于循环遍历集合,构建批量操作SQL。
- 使用PreparedStatement的addBatch()和executeBatch()方法。
-
缓存机制 MyBatis提供两种缓存机制:
- 一级缓存:会话级缓存,只对同一个SqlSession有效。
- 二级缓存:全局缓存,对多个SqlSession有效。
-
自定义缓存 MyBatis支持自定义缓存,包括以下步骤:
- 实现Cache接口。
- 在MyBatis配置文件中注册自定义缓存。
-
代理模式 代理模式是一种设计模式,用于在运行时动态创建对象实例。MyBatis使用代理模式实现动态代理,包括以下步骤:
- 实现InvocationHandler接口。
- 在MyBatis配置文件中配置代理。
-
MapperProxy MapperProxy是MyBatis的代理实现,用于拦截Mapper接口的方法,执行对应的SQL映射。
-
插件拦截 MyBatis插件拦截允许在执行SQL前或执行SQL后进行拦截操作,包括以下几种拦截器:
- Executor:拦截执行器的方法。
- ParameterHandler:拦截参数处理器的方法。
- ResultSetHandler:拦截结果处理器的方法。
- StatementHandler:拦截SQL语句的构建过程。
-
动态代理执行流程 动态代理执行流程如下:
- 创建InvocationHandler实例。
- 使用Proxy.newProxyInstance()方法创建代理对象。
- 调用代理对象的方法,实际调用InvocationHandler的invoke()方法。
-
SqlSession生命周期 SqlSession是MyBatis的会话对象,用于操作数据库。SqlSession的生命周期包括以下阶段:
- 创建SqlSession:通过SqlSessionFactory.openSession()或SqlSessionFactory.openSession(true)方法创建SqlSession。
- 使用SqlSession:执行数据库操作。
- 关闭SqlSession:关闭SqlSession,释放资源。
-
执行器类型 MyBatis提供以下几种执行器类型:
- SimpleExecutor:简单执行器,直接执行SQL。
- ReusingExecutor:重用预处理语句执行器,复用预处理语句。
- BatchExecutor:批量执行器,批量执行SQL。
-
延迟加载 延迟加载是一种懒加载技术,在需要使用对象属性时才进行加载。MyBatis支持延迟加载,包括以下步骤:
- 在 中设置属性为延迟加载 。
- 使用@Lazy注解定义属性为延迟加载。
-
扩展机制 MyBatis提供以下几种扩展机制:
- TypeHandler:类型处理器,用于转换Java类型和数据库类型。
- Interceptor:拦截器,用于拦截数据库操作。
- Plugin:插件,用于拦截MyBatis的执行过程。
-
类型处理器 类型处理器是用于转换Java类型和数据库类型的接口,MyBatis提供以下几种类型处理器:
- IntegerTypeHandler:转换整型。
- BigDecimalTypeHandler:转换浮点型。
- StringTypeHandler:转换字符串型。
-
拦截器链 拦截器链是一种拦截器组合机制,用于实现多个拦截器按顺序执行。MyBatis使用拦截器链实现拦截功能。
-
方言支持 MyBatis支持多种数据库方言,如MySQL、Oracle、SQLServer等。通过配置MyBatis方言,可以方便地切换数据库类型。
📥博主的人生感悟和目标

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

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