并发编程核心技术

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

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

优快云

一、并发编程知识体系

在计算机科学中,并发编程是处理多个任务同时执行的一种技术。下面我们将深入探讨并发编程的知识体系,从线程基础到并发框架,力求以通俗易懂的方式阐述,并补充其技术实现细节。

线程基础
  1. 线程定义:线程是程序执行的最小单元,是操作系统能够进行运算调度的基本单位。在技术实现上,线程通常由操作系统内核进行管理,通过线程控制块(Thread Control Block, TCB)来维护线程的状态和属性。

  2. 线程生命周期:线程从创建、就绪、运行、阻塞、等待、终止等状态转换。在技术实现上,线程的生命周期管理依赖于操作系统的调度算法,如时间片轮转调度、优先级调度等。

    • 创建:通过new Thread()或继承Thread类的方式创建线程。在技术实现上,创建线程时,操作系统会为线程分配TCB,并初始化线程的状态。

    • 就绪:线程已经被创建,等待CPU时间片。在技术实现上,就绪线程被加入就绪队列,等待调度。

    • 运行:线程获得CPU时间片,开始执行。在技术实现上,操作系统将CPU时间分配给线程,线程开始执行其任务。

    • 阻塞:线程因等待某些资源(如锁)而无法执行。在技术实现上,线程进入等待状态,并释放CPU时间片。

    • 等待:线程主动进入等待状态,直到被其他线程唤醒。在技术实现上,线程调用wait()方法进入等待状态,并释放锁。

    • 终止:线程执行完毕或被终止。在技术实现上,线程执行完毕后,操作系统回收TCB,线程生命周期结束。

  3. 线程优先级:线程优先级决定了线程获得CPU时间片的概率。在技术实现上,操作系统根据线程优先级分配CPU时间片,优先级高的线程获得更多的时间片。

  4. 守护线程:守护线程为其他线程提供服务,当没有非守护线程在运行时,守护线程也会终止。在技术实现上,守护线程在创建时被指定为守护状态,当主线程结束时,守护线程也会随之结束。

  5. 线程池:线程池是一组预先创建的线程,用于执行多个任务。在技术实现上,线程池通过任务队列管理任务,并维护一组工作线程,当任务提交到线程池时,工作线程从任务队列中取出任务执行。

  6. 同步机制

    • 悲观锁/乐观锁:悲观锁假定并发访问会导致数据不一致,乐观锁则假定不会。在技术实现上,悲观锁通常使用锁机制实现,如互斥锁(Mutex Lock)、读写锁(Read-Write Lock)等;乐观锁则使用版本号或时间戳等机制实现。

    • 读写锁:读写锁允许多个线程同时读取数据,但写入时需要独占访问。在技术实现上,读写锁通过读写计数器来控制对数据的访问,读操作增加读计数器,写操作增加写计数器,当写计数器不为零时,读操作将被阻塞。

    • 条件变量:线程在满足某些条件时才会继续执行。在技术实现上,条件变量通常与互斥锁结合使用,线程在等待条件变量时,会释放互斥锁,并在条件满足时重新获取互斥锁。

  7. 并发集合

    • ConcurrentHashMap:线程安全的HashMap。在技术实现上,ConcurrentHashMap采用分段锁(Segment Lock)机制,将数据分为多个段,每个段有自己的锁,从而实现线程安全。

    • CopyOnWrite容器:在修改时复制整个容器,提高读操作的性能。在技术实现上,当容器被修改时,会创建一个新的容器副本,并将修改后的数据写入副本,从而避免对原容器的并发访问。

    • BlockingQueue:线程安全的队列,用于线程间的通信。在技术实现上,BlockingQueue通过锁机制和条件变量实现线程安全,线程在添加或移除元素时,需要获取锁,并在条件满足时释放锁。

  8. 并发工具类

    • Phaser:支持线程之间协作的同步工具。在技术实现上,Phaser通过一个共享的计数器来管理线程的协作,线程在执行过程中,会调用Phaser的arrive()方法来更新计数器。

    • Exchanger:允许两个线程交换数据。在技术实现上,Exchanger通过一个共享的数据结构来存储交换的数据,两个线程在交换数据时,会使用Exchanger的exchange()方法。

    • FutureTask:异步计算的结果。在技术实现上,FutureTask是一个可以异步执行任务的线程,当任务执行完毕后,可以获取任务的结果。

  9. 非阻塞算法

    • CAS原理:比较并交换,用于实现无锁操作。在技术实现上,CAS操作通常使用硬件指令实现,如x86架构的CMPXCHG指令。

    • Atomic类:提供原子操作的类,如AtomicInteger、AtomicLong等。在技术实现上,Atomic类通过内部的自旋锁(Spin Lock)机制实现原子操作。

    • 无锁队列:基于CAS原理实现的线程安全队列。在技术实现上,无锁队列通过CAS操作来保证线程安全,线程在添加或移除元素时,会使用CAS操作来更新队列的状态。

  10. 并发框架

    • Netty线程模型:基于NIO的异步、事件驱动的网络应用框架。在技术实现上,Netty使用单线程模型,通过事件循环来处理网络事件,从而提高网络应用的性能。

    • Akka Actor模型:基于Actor模型的并发框架,用于构建分布式、高并发应用。在技术实现上,Akka使用Actor模型来模拟并发系统的通信和计算,每个Actor独立运行,并通过消息传递进行通信。

    • Disruptor环形缓冲区:用于处理高并发场景下的数据流。在技术实现上,Disruptor使用环形缓冲区来存储数据,并通过无锁算法来处理并发访问,从而提高数据处理的效率。

二、MyBatis知识体系

MyBatis是一个优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。下面我们将对MyBatis的知识体系进行详细阐述,并补充其技术实现细节。

SQL映射
  1. 注解映射:使用注解定义SQL映射,简化XML配置。在技术实现上,MyBatis通过解析注解来生成相应的SQL语句,从而减少XML配置的复杂度。

  2. 结果集映射:将数据库结果集映射到Java对象。在技术实现上,MyBatis通过反射和类型处理器(Type Handler)来实现结果集的映射。

  3. 关联查询:通过@One@Many注解实现一对多、多对一关联查询。在技术实现上,MyBatis通过动态SQL和嵌套查询来实现关联查询。

  4. 动态SQL:使用<if><choose><foreach>等标签实现动态SQL。在技术实现上,MyBatis通过解析XML配置来生成动态SQL语句。

  5. OGNL表达式:用于表达式计算,如@Select("select * from user where name like #{name} and age > #{age}")。在技术实现上,OGNL表达式通过解析表达式字符串来计算结果。

  6. 分支语句:使用<choose>标签实现条件分支。在技术实现上,MyBatis通过解析XML配置来生成条件分支的SQL语句。

  7. 批量操作:通过<foreach>标签实现批量插入、批量更新等操作。在技术实现上,MyBatis通过解析XML配置来生成批量操作的SQL语句。

缓存机制
  1. 一级缓存:SqlSession级别的缓存,用于缓存SQL语句及其结果集。在技术实现上,MyBatis使用HashMap来存储缓存数据,通过SqlSession来管理缓存的创建和销毁。

  2. 二级缓存:Mapper级别的缓存,用于缓存Mapper查询结果。在技术实现上,MyBatis使用HashMap来存储缓存数据,通过Mapper来管理缓存的创建和销毁。

  3. 自定义缓存:通过实现Cache接口自定义缓存策略。在技术实现上,自定义缓存需要实现Cache接口中的方法,如putObject()getObject()removeObject()等。

  4. 代理模式:使用MapperProxy实现动态代理,实现Mapper接口。在技术实现上,MyBatis使用Java的动态代理技术来生成Mapper接口的代理对象,代理对象负责调用真实的Mapper接口。

执行流程
  1. MapperProxy:通过动态代理实现Mapper接口。在技术实现上,MyBatis使用Java的动态代理技术来生成Mapper接口的代理对象,代理对象负责调用真实的Mapper接口。

  2. 动态代理执行流程:代理对象调用方法时,动态代理拦截调用,执行SQL语句并返回结果。在技术实现上,动态代理通过反射来调用目标对象的方法,并在方法执行前后进行拦截处理。

  3. SqlSession生命周期:SqlSession创建、使用、关闭。在技术实现上,SqlSession由SqlSessionFactory负责创建和管理,其生命周期由SqlSessionFactory管理。

  4. 执行器类型:SimpleExecutor、ReusingExecutor、BatchExecutor等。在技术实现上,MyBatis提供了多种执行器类型,以适应不同的场景需求。

  5. 延迟加载:在需要时才加载关联数据。在技术实现上,MyBatis通过动态代理和代理模式来实现延迟加载。

  6. 扩展机制:通过插件拦截、拦截器链等方式扩展MyBatis功能。在技术实现上,MyBatis通过插件和拦截器来实现功能的扩展。

类型处理器与拦截器
  1. 类型处理器:将数据库类型转换为Java类型。在技术实现上,MyBatis通过类型处理器(Type Handler)来实现数据库类型与Java类型的转换。

  2. 拦截器:拦截SQL执行过程,实现自定义逻辑。在技术实现上,MyBatis通过拦截器(Interceptor)来实现对SQL执行过程的拦截和处理。

  3. 拦截器链:拦截器按顺序执行,形成拦截器链。在技术实现上,MyBatis通过拦截器链(Interceptor Chain)来管理拦截器的执行顺序。

  4. 方言支持:支持不同数据库方言,如MySQL、Oracle等。在技术实现上,MyBatis通过方言(Dialect)来支持不同数据库的语法和特性。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

- 💂 博客主页Java程序员廖志伟
- 👉 开源项目Java程序员廖志伟
- 🌥 哔哩哔哩Java程序员廖志伟
- 🎏 个人社区Java程序员廖志伟
- 🔖 个人微信号SeniorRD

Java程序员廖志伟

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

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值