📕我是廖志伟,一名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)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程状态转换通常由线程调度算法控制,例如,线程从运行状态转变为就绪状态可能是因为时间片用尽或线程主动释放CPU。
-
线程优先级:线程优先级决定了线程在获得CPU时间片时的优先级,优先级高的线程更有可能获得CPU的执行权。线程优先级通常由操作系统提供,不同的操作系统和编程语言对优先级的设定和实现方式可能有所不同。
-
守护线程:守护线程是服务线程,它们在后台运行,不持有任何监视器锁,其生命周期完全由程序控制。守护线程通常用于执行一些不需要用户交互的辅助性任务,如垃圾回收。
-
线程池:线程池是一组预先创建的线程,用于执行多个任务。核心参数配置包括核心线程数、最大线程数、存活时间、队列类型等。线程池通过重用已有的线程来减少线程创建和销毁的开销,从而提高系统的响应速度。
核心参数配置与拒绝策略
线程池的核心参数配置包括:
-
核心线程数:线程池中最小的线程数,即使没有任务也会保持运行。核心线程数的选择需要根据系统的CPU资源和任务负载来决定。
-
最大线程数:线程池中最大的线程数,当任务数量超过核心线程数时,会创建新的线程来处理任务。最大线程数的选择需要考虑系统的资源限制和任务处理的实际需求。
-
存活时间:空闲线程在终止前可以保持的最大时间。存活时间的选择需要考虑系统资源的利用率和线程的创建与销毁开销。
-
工作队列类型:工作队列用于存放等待执行的任务,常见的队列类型有FIFO(先进先出)、LIFO(后进先出)等。队列类型的选择需要根据任务执行的特点和优先级策略来决定。
拒绝策略用于处理任务过多,无法被线程池接受的情况,常见的拒绝策略有:
-
AbortPolicy:抛出异常。当线程池无法处理新任务时,会抛出RejectedExecutionException异常。
-
CallerRunsPolicy:调用者运行,将任务回退到调用者线程。当线程池无法处理新任务时,将任务回退到调用者线程执行。
-
DiscardPolicy:直接丢弃任务。当线程池无法处理新任务时,直接丢弃任务。
-
DiscardOldestPolicy:丢弃最长时间的任务。当线程池无法处理新任务时,丢弃最长时间的任务。
同步机制
同步机制用于控制多个线程对共享资源的访问,确保数据的一致性和完整性。常见的同步机制包括:
-
悲观锁:假设数据在并发访问过程中可能会被修改,因此在访问数据前先加锁。悲观锁的实现方式通常包括互斥锁(Mutex)和读写锁(Read-Write Lock)。
-
乐观锁:假设数据在并发访问过程中不会发生冲突,因此在访问数据时不加锁,而是在更新数据时检查是否有其他线程已经修改了数据。乐观锁的实现方式通常基于版本号或时间戳。
-
读写锁:允许多个线程同时读取数据,但只允许一个线程写入数据。读写锁可以提高并发性能,尤其是在读多写少的场景下。
-
条件变量:线程在等待某个条件成立时,可以挂起自己,当条件成立时,其他线程可以唤醒挂起的线程。条件变量通常与互斥锁结合使用。
并发集合
并发集合是为了解决多线程环境下数据一致性问题而设计的集合类,包括:
-
ConcurrentHashMap:线程安全的HashMap,使用分段锁技术提高并发性能。ConcurrentHashMap将数据分为多个段,每个段有自己的锁,从而允许多个线程并发访问不同的段。
-
CopyOnWrite容器:在写操作时复制整个容器,读操作时读取副本,适用于读多写少的场景。CopyOnWrite容器适用于读操作非常频繁而写操作相对较少的场景。
并发工具类
并发工具类提供了更高级的并发控制功能,包括:
-
Phaser:用于控制多个线程的执行顺序,类似于CyclicBarrier和CountDownLatch。Phaser允许线程在某个阶段等待其他线程,直到所有线程都到达该阶段。
-
Exchanger:允许两个线程交换数据。Exchanger适用于需要线程之间进行数据交换的场景。
-
FutureTask:代表异步计算的结果。FutureTask允许线程提交一个异步任务,并获取该任务的结果。
-
非阻塞算法:使用CAS(Compare-And-Swap)操作实现无锁编程。非阻塞算法适用于对性能要求较高的场景。
CAS原理与Atomic类
CAS是一种原子操作,用于在多线程环境中实现无锁编程。Atomic类提供了原子操作的方法,包括:
-
AtomicInteger:原子整数。AtomicInteger提供了一系列原子操作方法,如compareAndSet、getAndIncrement等。
-
AtomicLong:原子长整数。AtomicLong提供了一系列原子操作方法,如compareAndSet、getAndIncrement等。
-
AtomicReference:原子引用。AtomicReference提供了一系列原子操作方法,如compareAndSet、getAndSet等。
无锁队列
无锁队列是一种基于CAS操作实现的并发队列,它允许多个线程高效地并发访问。无锁队列通常使用循环数组来实现,每个线程可以独立地添加或移除元素。
并发框架
并发框架提供了更高级的并发控制机制和工具,包括:
-
Netty线程模型:Netty使用主从多线程模型,主线程负责接收客户端连接,从线程负责处理业务逻辑。Netty的线程模型可以有效地提高并发性能。
-
Akka Actor模型:Akka使用Actor模型,每个Actor都是一个消息处理器,可以并发处理消息。Actor模型适用于高并发、高可扩展性的场景。
-
Disruptor环形缓冲区:Disruptor使用环形缓冲区来存储数据,并提供高效的并发访问。Disruptor适用于需要高并发性能的场景。
二、MyBatis知识体系
MyBatis是一个优秀的持久层框架,它对JDBC进行了封装,简化了数据库操作。以下是对MyBatis知识体系的详细描述。
SQL映射
MyBatis通过XML或注解的方式将SQL语句与Java对象进行映射。
-
注解映射:使用@Select、@Insert、@Update、@Delete等注解定义SQL语句。注解映射简化了SQL语句的定义,提高了代码的可读性。
-
结果集映射:将数据库查询结果映射到Java对象。结果集映射可以使用XML或注解的方式定义,包括字段映射、对象映射、复杂类型映射等。
-
关联查询:通过@One、@Many等注解实现多表关联查询。关联查询简化了多表操作,提高了代码的可读性和可维护性。
动态SQL
MyBatis支持动态SQL,可以根据条件动态生成SQL语句。
-
OGNL表达式:使用OGNL表达式动态生成SQL条件。OGNL表达式是一种表达式语言,可以方便地访问Java对象的属性和执行运算。
-
分支语句:使用 、 、 、 等标签实现条件分支。分支语句可以根据条件动态生成不同的SQL语句。
-
批量操作:使用 标签实现批量插入、更新等操作。批量操作可以减少数据库访问次数,提高性能。
缓存机制
MyBatis提供了缓存机制,可以减少数据库访问次数,提高性能。
-
一级缓存:会话级别的缓存,在同一个会话中可以共享。一级缓存的作用域较小,但速度快。
-
二级缓存:映射器级别的缓存,可以在不同的会话间共享。二级缓存的作用域较大,但速度相对较慢。
-
自定义缓存:允许自定义缓存实现。自定义缓存可以更好地满足特定场景的需求。
代理模式
MyBatis使用代理模式来实现延迟加载,即只有当真正需要数据时才进行数据库查询。
-
MapperProxy:MyBatis的Mapper接口代理类。MapperProxy负责拦截对Mapper接口的调用,并在真正需要数据时进行数据库查询。
-
插件:通过拦截MyBatis的执行流程来实现自定义功能。插件可以拦截SQL执行、结果集处理等环节,实现自定义功能。
执行流程
MyBatis的执行流程包括:
-
SqlSession生命周期:SqlSession是MyBatis的会话,它负责管理数据库连接、事务等。SqlSession的生命周期通常与数据库操作的范围一致。
-
执行器类型:MyBatis提供了多种执行器,如SimpleExecutor、BatchExecutor、ReuseExecutor等。不同的执行器适用于不同的场景。
-
延迟加载:对于懒加载的字段,MyBatis会在真正需要时才进行数据库查询。延迟加载可以减少数据库访问次数,提高性能。
扩展机制
MyBatis提供了多种扩展机制,包括:
-
类型处理器:用于将数据库类型转换为Java类型。类型处理器可以自定义数据库类型与Java类型的转换规则。
-
拦截器链:通过拦截器链可以拦截MyBatis的执行流程,实现自定义功能。拦截器链可以拦截SQL执行、结果集处理等环节。
-
方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle、SQL Server等。方言支持可以方便地适应不同的数据库环境。
📥博主的人生感悟和目标
- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
882

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



