📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。
🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。
一、并发编程知识体系
- 线程基础
线程是操作系统能够进行调度和执行的最小执行单元,它是实现并发编程的核心。线程的并行性体现在多个线程可以在同一时间内在不同的处理器上同时执行,从而提高程序的执行效率。线程的独立性意味着每个线程拥有独立的堆栈空间和程序计数器,使得线程间的数据互不干扰。
线程生命周期管理是并发编程的基础,一个线程从创建到终止会经历以下几个阶段:
- 创建:通过
Thread类或其子类构造函数创建线程。 - 就绪:线程创建后,进入就绪状态,等待被调度执行。
- 运行:线程被调度到处理器上执行。
- 阻塞:线程因为某些原因(如等待锁、等待I/O操作等)而无法继续执行。
- 等待:线程主动放弃CPU时间片,进入等待状态,直到某个条件成立。
- 超时:线程等待某个条件时超过了设定的超时时间。
- 终止:线程执行完毕或被外部强制终止。
线程优先级是操作系统用于调度线程的依据,不同优先级的线程在CPU时间分配上有所不同。在Java中,线程优先级分为1到10级,其中1是最低优先级,10是最高优先级。
守护线程(Daemon Thread)是一种特殊的线程,它不会阻止程序退出。当所有的非守护线程结束时,守护线程也会自动结束。
线程池是一种管理线程资源的方式,它可以复用一定数量的线程,避免频繁创建和销毁线程的开销。线程池的核心参数包括:
- 核心线程数:线程池中始终存在的线程数量。
- 最大线程数:线程池中允许的最大线程数量。
- 队列容量:工作队列的容量,用于存放等待执行的任务。
- 线程存活时间:空闲线程在终止前等待新任务的最长时间。
- 核心参数配置、拒绝策略、工作队列类型
线程池的核心参数配置需要根据具体的应用场景来设定。例如,如果任务是CPU密集型,则可以将核心线程数和最大线程数设置得相同,以避免过多的上下文切换。如果任务是I/O密集型,则可以设置较大的核心线程数和最大线程数,以充分利用I/O等待时间。
拒绝策略是指在任务无法被线程池接纳时采取的措施。常见的拒绝策略包括:
- AbortPolicy:抛出
RejectedExecutionException异常,终止程序。 - CallerRunsPolicy:调用者运行策略,将任务回退给调用者执行。
- DiscardPolicy:丢弃任务,不执行。
- DiscardOldestPolicy:丢弃最旧的任务。
工作队列类型决定了线程池如何处理等待执行的任务。常见的队列类型包括:
- ArrayBlockingQueue:基于数组的阻塞队列,具有固定容量。
- LinkedBlockingQueue:基于链表的阻塞队列,具有默认容量或可指定容量。
- PriorityBlockingQueue:具有优先级的阻塞队列,元素根据自然顺序或构造器中提供的Comparator进行排序。
- SynchronousQueue:同步队列,不存储元素,总是等待另一个线程来接收元素。
- 同步机制
同步机制用于协调多个线程对共享资源的访问,以避免竞态条件和数据不一致问题。
悲观锁假设共享资源每次访问都会发生冲突,因此在访问共享资源前先加锁。常见的悲观锁实现方式包括:
- Synchronized关键字:对方法或代码块进行同步。
- ReentrantLock:可重入的互斥锁。
乐观锁假设共享资源每次访问都不会发生冲突,因此采用版本号或时间戳来标识资源状态。当更新资源时,如果版本号或时间戳发生变化,则表示资源已被其他线程修改,需要重新获取资源。常见的乐观锁实现方式包括:
- CAS(Compare-And-Swap)操作:原子性地比较和交换内存位置的值。
- Atomic类:提供原子操作的各种类,如
AtomicInteger、AtomicLong等。
读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。常见的读写锁实现方式包括:
- ReentrantReadWriteLock:可重入的读写锁。
条件变量是线程在满足一定条件时才能继续执行的一种机制。线程在等待条件变量时会被阻塞,直到条件变量被满足。常见的条件变量实现方式包括:
- Object类的
wait()、notify()和notifyAll()方法。
- 并发集合
并发集合是专门为并发环境设计的集合类,它们提供了线程安全的操作。常见的并发集合包括:
- ConcurrentHashMap:基于分段锁的并发HashMap,通过分段锁技术提高并发性能。
- CopyOnWriteArrayList:在写操作时复制整个容器,避免了锁的竞争。
- BlockingQueue:阻塞队列,线程在等待任务时会被阻塞,常用于线程池和线程间通信。
- 并发工具类
并发工具类提供了各种并发编程的辅助功能,如线程管理、线程间通信等。常见的并发工具类包括:
- Phaser:管理线程的有序执行,用于实现线程间的协作。
- Exchanger:线程之间交换数据,常用于生产者-消费者模型。
- FutureTask:异步执行任务,返回Future对象,用于获取异步任务的结果。
- 非阻塞算法:如CAS原理、Atomic类等,用于实现无锁编程。
- 并发框架
并发框架提供了更高级别的并发编程抽象,帮助开发者简化并发编程的复杂性。常见的并发框架包括:
- Netty线程模型:基于事件驱动的异步网络框架,适用于高性能网络编程。
- Akka Actor模型:基于Actor的并发编程框架,强调消息传递和分布式计算。
- Disruptor环形缓冲区:高性能的并发队列,适用于高并发场景。
二、MyBatis知识体系
- SQL映射
MyBatis的SQL映射是MyBatis的核心功能之一,它将XML文件中的SQL语句与Java对象属性进行映射。常见的SQL映射包括:
- 注解映射:使用
@Select、@Insert、@Update、@Delete等注解标记映射关系。 - 结果集映射:将数据库字段映射到Java对象的属性,使用
<resultMap>标签进行配置。 - 关联查询:使用
<association>或<collection>标签解决一对多、多对多等复杂关系。
- 动态SQL
动态SQL允许根据条件动态构建SQL语句,常见的动态SQL包括:
- OGNL表达式:用于动态构建SQL语句,如
<if test="name != null">。 - 分支语句:根据条件执行不同的SQL片段,如
<choose>、<when>、<otherwise>。 - 批量操作:一次性执行多条SQL语句,如
<foreach>。
- 缓存机制
MyBatis的缓存机制包括一级缓存和二级缓存,以及自定义缓存策略和实现。一级缓存是SqlSession级别的缓存,用于缓存查询结果。二级缓存是全局范围内的缓存,可以跨SqlSession共享。自定义缓存允许开发者定义自己的缓存策略和实现。
- MapperProxy插件拦截、动态代理、执行流程
MyBatis使用动态代理技术实现Mapper接口,并通过MapperProxy进行插件拦截。执行流程包括解析SQL语句、执行SQL、处理结果集等步骤。
- SqlSession生命周期、执行器类型、延迟加载、扩展机制
SqlSession的生命周期包括创建、使用和关闭。执行器类型包括SimpleExecutor、ReuseExecutor和BatchExecutor,分别适用于不同的场景。延迟加载和按需加载是MyBatis的两种加载关联数据的方式,可以减少数据库的访问压力。
总结:
通过对并发编程和MyBatis知识体系的深入学习,可以更好地理解和应用这些技术,提高编程能力和系统性能。在实际开发中,应根据具体场景选择合适的技术方案,并注意合理配置和优化。
📥博主的人生感悟和目标
- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

被折叠的 条评论
为什么被折叠?



