📕我是廖志伟,一名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时间。线程的终止可以通过调用stop()
方法(已不推荐使用)或等待线程执行完毕来实现。
线程生命周期 线程的生命周期分为七个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程创建后处于新建状态,调用start()
方法后进入就绪状态,就绪状态下的线程可能被调度器选中进入运行状态。在运行过程中,线程可能会因为某些原因进入阻塞或等待状态,如等待资源或等待特定条件成立。超时等待状态是等待状态的一种,线程在等待一个特定时间后自动进入就绪状态。线程运行结束后进入终止状态。
线程优先级 线程优先级是Java虚拟机(JVM)用来决定线程调度顺序的一个属性。Java中的线程优先级分为1到10级,优先级高的线程更有可能获得CPU时间。线程的优先级可以通过getPriority()
和setPriority()
方法获取和设置。然而,线程优先级只是JVM调度的一个建议,并不能保证优先级高的线程一定能够获得更多的CPU时间。
守护线程 守护线程(Daemon Thread)是一种特殊的线程,它不会阻塞程序的主线程。守护线程通常用于执行一些后台任务,如垃圾回收器。当所有的守护线程都结束时,程序也会随之结束。守护线程可以通过调用setDaemon(true)
方法来设置。
线程池 线程池是一种管理线程的机制,它可以提高程序的性能和资源利用率。线程池的核心参数配置包括核心线程数、最大线程数、线程存活时间、工作队列类型和拒绝策略。核心线程数是线程池中最小的线程数量,即使没有任务提交,这些线程也会一直保持活动状态。最大线程数是线程池可以创建的最大线程数量。线程存活时间是指线程空闲的时间,超过这个时间后线程将被回收。工作队列类型决定了等待执行的任务如何存储。拒绝策略用于处理当线程池中的线程已满,无法再接受新任务时的处理方式。
拒绝策略 拒绝策略用于处理当线程池中的线程已满,无法再接受新任务时的处理方式。常见的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。AbortPolicy策略会抛出RejectedExecutionException
异常,CallerRunsPolicy策略会将任务交给调用者线程执行,DiscardPolicy策略会直接丢弃任务,DiscardOldestPolicy策略会丢弃最长时间等待的任务。
工作队列类型 工作队列是线程池中用于存放等待执行的任务的队列。常见的队列类型有LinkedBlockingQueue、ArrayBlockingQueue和SynchronousQueue。LinkedBlockingQueue是一个基于链表的阻塞队列,ArrayBlockingQueue是一个基于数组的阻塞队列,SynchronousQueue是一个不存储元素的阻塞队列。
同步机制 同步机制是保证线程安全的关键。常见的同步机制有悲观锁/乐观锁、读写锁、条件变量和并发集合。悲观锁/乐观锁是解决并发访问冲突的两种策略。悲观锁认为线程冲突的可能性很大,因此在操作数据前会先加锁,直到操作完成才释放锁。乐观锁则认为线程冲突的可能性很小,因此采用版本号或时间戳来检测冲突。读写锁允许多个线程同时读取数据,但只有一个线程可以写入数据。条件变量是一种线程间通信的方式,它可以实现线程间的同步和协作。并发集合是为了解决多线程环境下的数据一致性问题而设计的集合类。
悲观锁/乐观锁 悲观锁认为线程冲突的可能性很大,因此在操作数据前会先加锁,直到操作完成才释放锁。Java中可以使用synchronized
关键字、ReentrantLock
类或java.util.concurrent.atomic
包中的原子类来实现悲观锁。乐观锁则认为线程冲突的可能性很小,因此采用版本号或时间戳来检测冲突。Java中可以使用java.util.concurrent.atomic
包中的原子类来实现乐观锁。
读写锁 读写锁允许多个线程同时读取数据,但只有一个线程可以写入数据。Java中可以使用java.util.concurrent.locks.ReentrantReadWriteLock
类来实现读写锁。
条件变量 条件变量是一种线程间通信的方式,它可以实现线程间的同步和协作。Java中可以使用java.util.concurrent.locks.Condition
接口来实现条件变量。
并发集合 并发集合是为了解决多线程环境下的数据一致性问题而设计的集合类。常见的并发集合有ConcurrentHashMap
、CopyOnWriteArrayList
和ConcurrentLinkedQueue
。
BlockingQueue BlockingQueue是一种线程安全的队列,它可以实现线程间的生产者和消费者模型。常见的BlockingQueue实现有LinkedBlockingQueue
和ArrayBlockingQueue
。
并发工具类 并发工具类提供了许多方便的并发编程工具,如Phaser、Exchanger和FutureTask。
Phaser Phaser是一个用于协调多个线程的并发工具,它可以实现线程间的等待和通知。Phaser可以用来实现线程间的同步,例如,在执行并行任务之前等待所有线程就绪。
Exchanger Exchanger是一个用于交换两个线程数据的并发工具。Exchanger可以用来实现线程间的数据交换,例如,在两个线程之间交换数据。
FutureTask FutureTask是一个可以表示异步计算结果的Future对象。FutureTask可以用来实现异步编程,例如,在后台线程中执行任务,并在任务完成后获取结果。
非阻塞算法 非阻塞算法是一种在多线程环境下避免锁和同步的算法。常见的非阻塞算法有CAS(Compare-And-Swap)原理和Atomic类。
CAS原理 CAS原理是一种无锁算法,它通过比较和交换操作来保证操作的原子性。在Java中,可以使用java.util.concurrent.atomic
包中的原子类来实现CAS操作。
Atomic类 Atomic类提供了各种原子操作的方法,如AtomicInteger
、AtomicLong
和AtomicReference
。这些原子类可以用来实现无锁编程,提高并发性能。
无锁队列 无锁队列是一种不依赖于锁的并发队列,它通过CAS原理实现线程安全。常见的无锁队列实现有ConcurrentLinkedQueue
。
并发框架 并发框架是为了简化并发编程而设计的框架。常见的并发框架有Netty、Akka和Disruptor。
Netty线程模型 Netty是一个高性能的NIO框架,它采用了主从多线程模型,将读写操作分离,提高了并发性能。在Netty中,主线程负责接收和处理连接,从线程负责读写操作。
Akka Actor模型 Akka是一个基于Actor模型的并发框架,它将并发编程抽象为Actor的创建、发送消息和接收消息。在Akka中,Actor是一个对象,它可以发送和接收消息,并且具有自己的状态。
Disruptor环形缓冲区 Disruptor是一个高性能的并发框架,它采用环形缓冲区来存储数据,并通过CAS原理实现线程安全。Disruptor可以用来实现高性能的并发队列,例如,在消息队列中处理消息。
二、MyBatis知识体系
SQL映射 MyBatis是一种基于SQL映射的持久层框架,它将Java对象和数据库表之间的映射关系通过XML或注解来定义。在MyBatis中,SQL映射可以通过XML文件或注解来实现。XML映射文件定义了SQL语句和Java对象之间的映射关系,而注解映射则通过在Java接口或类上添加注解来实现映射。
注解映射 MyBatis支持使用注解来定义SQL映射,从而简化了映射过程。在MyBatis中,可以使用@Select
、@Insert
、@Update
和@Delete
等注解来定义SQL映射。
结果集映射 结果集映射是指将数据库查询结果映射到Java对象的过程。MyBatis提供了多种映射方式,如一对一、一对多和多对多。一对一映射是指将一条记录映射到一个Java对象,一对多映射是指将一条记录映射到多个Java对象,多对多映射是指将多条记录映射到多个Java对象。
关联查询 关联查询是指查询多个表之间的关系,MyBatis通过嵌套查询和关联查询来实现关联查询。嵌套查询是指在一个查询中包含另一个查询,关联查询是指通过连接操作查询多个表之间的关系。
动态SQL 动态SQL是指根据条件动态生成SQL语句的过程。MyBatis提供了基于OGNL表达式和分支语句的动态SQL功能。OGNL是一种表达式语言,可以用来动态生成SQL语句。
批量操作 批量操作是指同时执行多个数据库操作的过程。MyBatis支持批量插入、更新和删除操作。批量操作可以提高数据库操作的效率。
缓存机制 MyBatis提供了缓存机制,分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,它存储了最近执行的SQL语句及其结果。二级缓存是Mapper级别的缓存,它存储了整个应用范围内的SQL语句及其结果。
一级缓存 一级缓存是SqlSession级别的缓存,它存储了最近执行的SQL语句及其结果。当SqlSession关闭时,一级缓存也会随之消失。
二级缓存 二级缓存是Mapper级别的缓存,它存储了整个应用范围内的SQL语句及其结果。二级缓存可以跨SqlSession共享,但需要手动配置。
自定义缓存 MyBatis允许用户自定义缓存,通过实现Cache接口来实现。自定义缓存可以用于存储更复杂的数据结构,例如,可以将缓存存储在Redis或Memcached等缓存系统中。
代理模式 MyBatis使用代理模式来实现Mapper接口的动态代理,从而实现对数据库操作的封装。动态代理允许在运行时创建代理对象,代理对象可以拦截对目标对象的调用,并实现自定义逻辑。
MapperProxy MapperProxy是MyBatis中用于实现Mapper接口动态代理的类。MapperProxy通过反射机制创建代理对象,并拦截对Mapper接口的调用。
插件拦截 MyBatis允许用户自定义插件,通过拦截执行流程来实现自定义功能。插件可以用于实现日志记录、性能监控等功能。
动态代理执行流程 MyBatis通过动态代理执行流程来实现Mapper接口的调用。当调用Mapper接口的方法时,动态代理会拦截调用,并执行自定义逻辑。
SqlSession生命周期 SqlSession是MyBatis中的核心对象,它负责管理数据库连接和事务。SqlSession的生命周期包括创建、使用和关闭。当创建SqlSession时,MyBatis会建立数据库连接,并开启事务。当使用完SqlSession后,需要关闭它,释放数据库连接和事务。
执行器类型 MyBatis提供了多种执行器类型,如SimpleExecutor和ReuseExecutor,它们分别适用于不同的场景。SimpleExecutor是MyBatis默认的执行器,它每次执行SQL语句都会创建一个新的数据库连接。ReuseExecutor则复用数据库连接,可以提高性能。
延迟加载 延迟加载是指在实际需要时才加载数据的策略。MyBatis支持延迟加载关联对象。在延迟加载过程中,关联对象的数据不会立即加载,而是在需要时才加载。
扩展机制 MyBatis提供了扩展机制,如类型处理器、拦截器链和方言支持。
类型处理器 类型处理器用于将数据库中的数据类型转换为Java对象中的数据类型。MyBatis提供了多种类型处理器,例如,可以将数据库中的INT
类型转换为Java中的Integer
类型。
拦截器链 拦截器链用于拦截MyBatis的执行流程,实现自定义功能。MyBatis提供了多种拦截器,例如,可以拦截SQL语句的执行、结果集的处理等。
方言支持 方言支持是指MyBatis对不同数据库的SQL方言进行适配。MyBatis提供了多种方言,例如,可以适配MySQL、Oracle等数据库的SQL方言。
总结 本文详细介绍了并发编程和MyBatis的知识体系,从线程基础、线程池、同步机制到并发集合、并发工具类和并发框架,再到MyBatis的SQL映射、动态SQL、缓存机制和扩展机制。通过这些知识点的串联,读者可以举一反三,更好地理解和应用并发编程和MyBatis技术。
📥博主的人生感悟和目标

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

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