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

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

【一、并发编程知识体系】
线程基础
-
线程生命周期:线程的生命周期是由JVM管理的,其状态变化遵循一定的规则。在Java中,线程的生命周期主要包括以下状态:
- 新建(New):线程对象被创建,但尚未启动。
- 就绪(Runnable):线程已经准备好运行,等待被CPU调度。
- 运行(Running):线程正在执行。
- 阻塞(Blocked):线程因等待某个资源或等待某个事件发生而无法继续执行。
- 等待(Waiting):线程在等待某个条件成立,通过Object.wait()方法进入等待状态。
- 超时等待(Timed Waiting):线程在等待某个条件成立,但设置了一个超时时间,通过Object.wait(long timeout)方法进入。
- 终止(Terminated):线程执行完毕或因异常终止。
-
线程优先级:Java中的线程优先级分为最高(MAX_PRIORITY)、正常(NORM_PRIORITY)和最低(MIN_PRIORITY)三个等级,优先级高的线程在多线程环境中更可能获得CPU执行时间。
-
守护线程:在Java中,守护线程是一种特殊的线程,其生命周期由主程序控制。当所有非守护线程执行完毕后,程序将自动退出,此时守护线程也会随之结束。
-
线程池:线程池的核心实现依赖于一个工作队列,用于存储待执行的任务。当有任务提交到线程池时,首先会检查核心线程数是否已满,如果未满,则创建新线程执行任务;如果已满,则根据拒绝策略处理。
-
核心参数配置:核心线程数决定了线程池的初始线程数;最大线程数决定了线程池能创建的最大线程数;线程活跃时间决定了线程在空闲时多久后被回收;任务队列决定了任务如何存储;拒绝策略决定了当任务无法被处理时如何处理。
-
拒绝策略:常见的拒绝策略包括:CallerRunsPolicy(调用者运行策略)、AbortPolicy(抛出异常策略)、DiscardPolicy(丢弃策略)和DiscardOldestPolicy(丢弃最旧策略)。
-
工作队列类型:工作队列可以是数组、链表、阻塞队列等。
-
同步机制:线程池内部通过锁机制保证线程安全,如ReentrantLock、Semaphore等。
-
-
并发集合:在Java中,并发集合如ConcurrentHashMap、CopyOnWriteArrayList等,通过锁机制或无锁算法实现线程安全。
-
BlockingQueue:BlockingQueue是一个线程安全的队列,其内部通过锁机制保证线程安全,支持生产者-消费者模型。
-
并发工具类:Phaser是一个线程同步工具,用于解决线程间的同步问题;Exchanger允许两个线程交换数据;FutureTask是一个异步计算任务,用于获取计算结果。
-
非阻塞算法:CAS(Compare-And-Swap)是一种无锁算法,用于实现原子操作;Atomic类提供了一系列原子操作的方法;无锁队列通过无锁算法实现线程安全。
-
并发框架:Netty线程模型采用主从多线程模式,提高并发性能;Akka Actor模型采用消息传递机制,实现并发编程;Disruptor环形缓冲区通过环形队列和CAS算法实现高并发。
【二、MyBatis知识体系】
-
SQL映射:MyBatis通过XML或注解的方式,将Java对象与数据库表进行映射。XML映射文件中定义了SQL语句、参数、结果集映射等;注解映射则通过在Java接口或方法上添加注解实现映射。
-
注解映射:MyBatis提供了多种注解,如@Select、@Insert、@Update、@Delete等,用于映射SQL语句。例如,@Select注解用于映射查询语句,@Insert注解用于映射插入语句。
-
结果集映射:MyBatis将数据库查询结果映射为Java对象,通过ResultMap实现。ResultMap定义了结果集字段与Java对象属性的映射关系。
-
关联查询:MyBatis支持多表关联查询,通过嵌套查询或关联映射实现。嵌套查询通过
- 标签实现;关联映射通过@One、@Many注解实现。 动态SQL:MyBatis支持动态SQL,如OGNL表达式、分支语句、批量操作等。通过、、等标签实现动态SQL。 缓存机制:MyBatis提供了缓存机制,包括一级缓存和二级缓存。 一级缓存:MyBatis会为每个SqlSession对象创建一个本地缓存,用于存储最近执行的SQL语句及其结果。 二级缓存:MyBatis支持跨SqlSession的缓存,通过实现Cache接口自定义缓存。二级缓存可以跨SqlSession持久化,但需要在全局范围内配置。 自定义缓存:通过实现Cache接口,可以自定义缓存策略,如LRU、FIFO等。 代理模式:MyBatis使用代理模式实现了Mapper接口的动态代理,从而实现了Mapper接口的延迟加载。 MapperProxy:MapperProxy是MyBatis中用于实现Mapper接口动态代理的类,通过JDK动态代理技术实现。 插件拦截:MyBatis支持插件拦截,如执行器拦截、动态代理执行流程拦截等。通过实现Interceptor接口,可以自定义插件拦截逻辑。 SqlSession生命周期:SqlSession是MyBatis的核心对象,负责执行SQL语句。SqlSession的生命周期包括创建、使用、提交、回滚、关闭等。 执行器类型:MyBatis提供了多种执行器类型,如SimpleExecutor、ReuseExecutor、BatchExecutor等。SimpleExecutor为简单执行器,ReuseExecutor为重用预处理语句执行器,BatchExecutor为批量执行器。 延迟加载:MyBatis支持延迟加载,如加载关联对象时,仅在需要时才进行加载。通过@Lazy注解实现延迟加载。 扩展机制:MyBatis提供了多种扩展机制,如类型处理器、拦截器链、方言支持等。通过实现相应的接口,可以自定义扩展功能。 通过以上知识点的串联,我们可以深入理解并发编程和MyBatis在Java开发中的应用。以下是一些应用场景: 线程池与MyBatis:在执行数据库操作时,可以使用线程池来提高并发性能。MyBatis支持自定义执行器,可以通过配置线程池实现数据库操作的并发优化。 并发集合与MyBatis:在处理MyBatis的缓存时,可以使用并发集合来保证线程安全。 非阻塞算法与MyBatis:在实现MyBatis的动态SQL时,可以使用非阻塞算法提高性能。 并发框架与MyBatis:在构建大型分布式系统时,可以使用并发框架与MyBatis结合,实现高性能、高可靠性的数据库操作。 总之,掌握并发编程和MyBatis知识,可以帮助我们更好地设计和实现高性能、高可靠的Java应用程序。 📥博主的人生感悟和目标 希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励! - 💂 博客主页: Java程序员廖志伟 - 👉 开源项目:Java程序员廖志伟 - 🌥 哔哩哔哩:Java程序员廖志伟 - 🎏 个人社区:Java程序员廖志伟 - 🔖 个人微信号: SeniorRD 📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持! 🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~