📕我是廖志伟,一名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接口来创建。线程具有以下特点:
- 独立控制:线程可以独立地执行,互不干扰。这意味着一个线程的崩溃或异常不会影响其他线程的执行。
- 资源共享:线程可以共享进程中的资源,如内存、文件等。但需要注意的是,线程间的资源共享可能会导致竞态条件,需要通过同步机制来避免。
- 并行执行:多个线程可以同时执行,提高程序执行效率。在多核处理器上,线程的并行执行可以显著提升程序性能。
- 线程生命周期 线程生命周期包括以下状态:
- 新建(New):线程对象被创建,但尚未启动。此时线程尚未分配到CPU资源。
- 就绪(Runnable):线程被调度到就绪队列,等待CPU时间片。就绪状态的线程已经准备好执行,但尚未获得CPU资源。
- 运行(Running):线程获得CPU时间片,开始执行。运行状态的线程正在使用CPU资源执行任务。
- 阻塞(Blocked):线程因等待某些资源而无法执行。例如,线程可能因等待互斥锁而阻塞。
- 终止(Terminated):线程执行完毕或被强制终止。终止状态的线程已经释放了所有资源。
- 线程优先级 线程优先级用于表示线程获取CPU时间片的优先程度。Java中,线程优先级分为以下等级:
- MAX_PRIORITY:最高优先级,通常为10。
- MIN_PRIORITY:最低优先级,通常为1。
- NORM_PRIORITY:默认优先级,通常为5。
-
守护线程 守护线程是服务线程,它不会阻止程序退出。当所有非守护线程结束时,程序将自动退出。守护线程通常用于执行一些后台任务,如垃圾回收。在Java中,可以通过调用
setDaemon(true)方法将线程设置为守护线程。 -
线程池 线程池是管理一组线程的容器,它可以提高程序执行效率,减少线程创建和销毁的开销。线程池的核心参数配置包括:
- 核心线程数:线程池中保持活跃的线程数量。核心线程数通常设置为可用处理器的数量。
- 最大线程数:线程池中允许的最大线程数量。最大线程数通常设置为核心线程数的两倍。
- 队列类型:工作队列类型,如LinkedBlockingQueue、ArrayBlockingQueue等。工作队列用于存储等待执行的线程任务。
- 拒绝策略:当线程池达到最大线程数时,如何处理新任务。拒绝策略可以是抛出异常、丢弃任务或提交给其他线程池。
- 同步机制 同步机制用于解决多线程并发访问共享资源时可能出现的竞态条件。常见的同步机制包括:
- 悲观锁:假设线程在访问共享资源时会发生冲突,因此在访问前先加锁。Java中,可以使用
synchronized关键字或ReentrantLock类来实现悲观锁。 - 乐观锁:假设线程在访问共享资源时不会发生冲突,因此在访问时才加锁。Java中,可以使用
Atomic类或ConcurrentHashMap来实现乐观锁。 - 读写锁:允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。Java中,可以使用
ReentrantReadWriteLock类来实现读写锁。 - 条件变量:线程在等待某个条件成立时,可以挂起等待,直到条件成立。Java中,可以使用
Object类的wait()、notify()和notifyAll()方法来实现条件变量。
-
并发集合 并发集合是专门为多线程环境设计的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。它们提供了线程安全的操作,避免了并发访问时的竞态条件。并发集合通常使用分段锁或CAS算法来实现线程安全。
-
并发工具类 并发工具类用于简化并发编程,如Phaser、Exchanger、FutureTask等。它们提供了丰富的并发操作,如线程同步、线程通信、任务执行等。例如,Phaser可以用于协调多个线程的执行顺序;Exchanger可以用于在线程间交换数据。
-
非阻塞算法 非阻塞算法是一种不依赖于锁和等待机制的并发算法,如CAS(Compare-And-Swap)算法。CAS算法利用硬件指令实现无锁操作,提高了并发性能。非阻塞算法适用于高并发场景,但实现复杂度较高。
-
无锁队列 无锁队列是一种基于CAS算法实现的并发队列,如ConcurrentLinkedQueue。它避免了锁的开销,提高了并发性能。无锁队列适用于高并发场景,但可能存在内存碎片问题。
-
并发框架 并发框架是用于简化并发编程的工具,如Netty、Akka、Disruptor等。它们提供了丰富的并发编程组件和抽象,降低了并发编程的难度。并发框架通常使用事件驱动或actor模型来实现并发编程。
二、MyBatis知识体系
- SQL映射 SQL映射是MyBatis的核心功能,它将Java对象与数据库表进行映射。SQL映射包括以下内容:
- 注解映射:使用注解定义SQL映射关系。例如,可以使用
@Select注解定义查询语句。 - 结果集映射:将数据库表中的字段映射到Java对象的属性。例如,可以使用
@Results注解定义映射关系。 - 关联查询:处理多表关联查询,如一对一、一对多、多对多关系。例如,可以使用
@One、@Many注解定义关联关系。
- 动态SQL 动态SQL允许在运行时根据条件动态生成SQL语句。MyBatis提供了以下动态SQL功能:
- OGNL表达式:使用OGNL表达式动态构建SQL语句。OGNL是一种表达式语言,用于访问对象的属性和执行简单的逻辑运算。
- 分支语句:根据条件动态选择执行不同的SQL语句。例如,可以使用
<if>标签实现条件分支。 - 批量操作:同时执行多条SQL语句。例如,可以使用
<foreach>标签实现批量插入或更新操作。
- 缓存机制 MyBatis提供了两种缓存机制:
- 一级缓存:会话级别的缓存,用于存储查询结果。一级缓存是MyBatis的默认缓存机制。
- 二级缓存:全局级别的缓存,用于存储查询结果。二级缓存可以跨会话共享,但需要手动配置。
-
自定义缓存 MyBatis允许自定义缓存实现,以适应不同的应用场景。自定义缓存需要实现Cache接口。自定义缓存可以提供更灵活的缓存策略,如基于LRU算法的缓存淘汰策略。
-
代理模式 MyBatis使用代理模式来实现动态代理,如MapperProxy。代理模式可以动态生成代理对象,实现Mapper接口。动态代理可以减少代码量,提高开发效率。
-
插件拦截 MyBatis允许使用插件拦截SQL执行过程,如执行器拦截、类型处理器拦截等。插件拦截可以用于统计SQL执行时间、日志记录等。插件拦截可以提高代码的可扩展性和可维护性。
-
动态代理执行流程 MyBatis使用动态代理执行Mapper接口的方法。动态代理执行流程如下:
- 创建代理对象:使用Cglib或JDK动态代理技术创建代理对象。
- 调用代理对象的方法:代理对象的方法调用将被转发到目标对象的方法。
- 执行代理对象的拦截器链:代理对象的方法调用将经过拦截器链的处理。
- 执行Mapper接口的方法:拦截器链处理完成后,执行Mapper接口的方法。
- 返回执行结果:Mapper接口的方法执行完成后,返回执行结果。
- SqlSession生命周期 SqlSession是MyBatis的核心接口,用于操作数据库。SqlSession生命周期包括以下阶段:
- 创建SqlSession:通过
SqlSessionFactory创建SqlSession。 - 使用SqlSession执行数据库操作:使用SqlSession执行查询、更新、删除等数据库操作。
- 关闭SqlSession:关闭SqlSession,释放数据库连接和其他资源。
-
执行器类型 MyBatis提供了多种执行器类型,如SimpleExecutor、ReusingExecutor、BatchingExecutor等。执行器类型决定了SQL执行的策略。例如,SimpleExecutor采用预编译SQL语句的方式执行查询,而BatchingExecutor采用批量执行SQL语句的方式提高执行效率。
-
延迟加载 延迟加载是一种优化技术,它将关联查询的执行延迟到真正需要时。MyBatis支持延迟加载,以减少数据库访问次数。例如,可以使用
<Lazy>标签定义延迟加载的关联关系。 -
扩展机制 MyBatis提供了丰富的扩展机制,如类型处理器、拦截器链、方言支持等。扩展机制可以满足不同的应用需求。例如,可以自定义类型处理器来处理自定义类型的数据;可以自定义拦截器来拦截SQL执行过程。
📥博主的人生感悟和目标
- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
1080

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



