并发编程核心知识

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

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

Java程序员廖志伟

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

优快云

一、并发编程知识体系

并发编程是现代计算机科学中的一个核心概念,它涉及到多线程的创建、管理以及同步与通信。以下是对并发编程知识体系的详细描述,旨在以专业性高且通俗易懂的方式阐述。

线程基础

线程是程序执行的最小单位,它是操作系统能够进行运算调度的最小单位。线程基础包括:

  • 线程生命周期:线程的生命周期从创建(创建线程)、就绪(线程准备就绪,等待CPU调度)、运行(获得CPU时间执行任务)、阻塞(执行过程中因等待某些资源而暂停)、等待(主动进入等待状态,如调用wait方法)、超时(等待超时)、终止(线程执行完毕或被强制终止)等状态变化过程。线程状态的转换通常由线程本身的行为和外部事件触发。

  • 线程优先级:线程优先级是操作系统中用来决定线程调度顺序的一个参数。不同操作系统和语言对线程优先级的支持不同,通常通过优先级高的线程获得更多的CPU时间片。线程优先级通常分为静态优先级和动态优先级,静态优先级在创建线程时设置,而动态优先级可以根据线程的执行情况进行调整。

  • 守护线程:守护线程(也称为后台线程)是服务线程,它不会阻止程序终止。在Java中,如果所有的非守护线程都执行完毕,即使还有守护线程在运行,程序也会终止。守护线程通常用于执行一些不需要用户交互的任务,如垃圾回收。

  • 线程池:线程池是一种管理线程的机制,它维护一组线程以执行任务。线程池可以减少线程创建和销毁的开销,提高性能。线程池的核心参数配置包括核心线程数、最大线程数、存活时间等,这些参数可以根据具体的应用场景进行调整。

核心参数配置与拒绝策略

线程池的核心参数配置包括:

  • 核心线程数:线程池中始终存在的线程数量,即使没有任务执行时,这些线程也会保持活动状态。

  • 最大线程数:线程池能够维护的最大线程数,当任务数量超过核心线程数时,会创建新的线程来处理任务。

  • 存活时间:线程池中空闲线程的存活时间,超过这个时间后,空闲线程会被回收。

拒绝策略用于处理当任务无法被线程池接受时的情况,常见的拒绝策略有:

  • CallerRunsPolicy:将任务回退给调用者线程执行,这可能导致调用者线程的负载增加。

  • AbortPolicy:抛出RejectedExecutionException异常,表明任务无法被线程池接受。

  • DiscardPolicy:丢弃任务,不抛出异常,适用于对任务完成没有要求的场景。

  • DiscardOldestPolicy:丢弃最旧的未处理任务,这可能会导致任务执行顺序的改变。

工作队列类型

线程池的工作队列是用于存放等待执行的任务,常见的工作队列类型有:

  • LinkedBlockingQueue:基于链表的阻塞队列,支持自动扩容。

  • ArrayBlockingQueue:基于数组的阻塞队列,具有固定大小,不支持自动扩容。

  • SynchronousQueue:不存储元素的阻塞队列,每个插入操作都需要等待另一个线程的删除操作。

同步机制

同步机制用于控制对共享资源的访问,确保线程安全。常见的同步机制包括:

  • 悲观锁/乐观锁:悲观锁假设冲突将会发生,因此在访问共享资源前先加锁;乐观锁假设冲突不会发生,采用版本号或时间戳机制来检测冲突。乐观锁通常使用CAS(Compare-And-Swap)操作实现。

  • 读写锁:读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。读写锁可以提高并发性能,因为它允许多个读操作同时进行。

  • 条件变量:条件变量允许线程在某个条件不满足时等待,直到条件满足时被唤醒。条件变量通常与互斥锁结合使用。

并发集合

并发集合是专为并发环境设计的集合类,如:

  • ConcurrentHashMap:线程安全的HashMap实现,采用分段锁(Segment Locking)机制,将数据分为多个段,每个段有自己的锁,从而提高并发性能。

  • CopyOnWriteArrayList:线程安全的List实现,通过复制整个底层数组来保证线程安全。这种实现方式适用于读多写少的场景。

并发工具类

一些并发工具类,如:

  • Phaser:一个灵活的同步工具,用于协调多个线程的执行。Phaser允许线程在执行过程中动态地注册和注销阶段,从而实现更复杂的同步逻辑。

  • Exchanger:用于在线程间交换数据的工具。Exchanger允许两个线程在某个点交换数据,而不需要共享内存。

  • FutureTask:一个表示异步计算结果的Future,它允许调用者获取计算结果或取消计算。

非阻塞算法

非阻塞算法通过无锁的方式处理并发问题,如:

  • CAS(Compare-And-Swap)原理:比较并交换,用于实现无锁算法。CAS操作包括三个操作数:内存位置、预期值和新值。如果内存位置的值与预期值相等,则将其更新为新值。

  • Atomic类:提供原子操作的类,如AtomicInteger、AtomicLong等。这些类内部使用CAS操作来保证操作的原子性。

  • 无锁队列:如ConcurrentLinkedQueue,基于CAS原理实现的无锁队列。无锁队列可以提供高并发性能,因为它避免了锁的开销。

并发框架

一些并发框架,如:

  • Netty线程模型:Netty采用主从多线程模型,通过NIO(非阻塞IO)提高并发性能。Netty的主线程负责处理连接、接受数据等任务,从线程负责处理实际的数据处理任务。

  • Akka Actor模型:Akka是一个基于actor的并发模型,每个actor都是一个独立的线程,可以发送消息。Akka通过actor系统实现了高并发和分布式计算。

  • Disruptor环形缓冲区:Disruptor是一个高性能的并发队列,基于环形缓冲区实现。Disruptor通过预分配缓冲区和无锁算法,提供了高吞吐量和低延迟的并发处理能力。

二、MyBatis知识体系

MyBatis是一个优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。

SQL映射

MyBatis的SQL映射包括:

  • 注解映射:使用注解来映射SQL语句和结果集。例如,使用@Select注解来定义查询语句,使用@Results注解来定义结果集的映射。

  • 结果集映射:定义如何将数据库结果集映射到Java对象。这通常通过XML配置文件来实现,也可以使用注解。

  • 关联查询:处理多表关联查询,将多个表的数据映射到Java对象。MyBatis支持多种关联查询方式,如嵌套查询、联合查询等。

动态SQL

MyBatis支持动态SQL,如:

  • OGNL表达式:使用OGNL表达式来动态构建SQL语句。OGNL是一个强大的表达式语言,可以用于访问对象的属性、执行运算等。

  • 分支语句:根据条件动态选择不同的SQL语句。例如,使用 标签来根据条件选择不同的SQL片段。

  • 批量操作:执行批量插入、更新或删除操作。MyBatis支持批量操作,可以显著提高性能。

缓存机制

MyBatis的缓存机制包括:

  • 一级缓存:SqlSession级别的缓存,用于存储最近执行的查询结果。一级缓存是MyBatis内部实现的缓存,仅在SqlSession生命周期内有效。

  • 二级缓存:Mapper级别的缓存,可以跨SqlSession持久化。二级缓存可以配置为基于内存或基于其他持久化存储,如Redis。

  • 自定义缓存:允许自定义缓存实现,以满足特定需求。

  • 代理模式:MyBatis使用代理模式来处理Mapper接口,使得MyBatis能够拦截接口方法的调用,并执行相应的SQL语句。

MapperProxy与插件
  • MapperProxy:MyBatis使用动态代理技术来实现Mapper接口。动态代理允许在运行时创建接口的代理实例,并在代理实例上拦截方法调用。

  • 插件:MyBatis允许自定义插件来拦截执行过程。插件可以用于日志记录、性能监控等。

执行流程

MyBatis的执行流程包括:

  • SqlSession生命周期:SqlSession的创建、使用和关闭。SqlSession是MyBatis的核心接口,用于管理数据库连接和执行SQL语句。

  • 执行器类型:MyBatis提供了多种执行器类型,如简单执行器、批处理执行器等。不同的执行器类型适用于不同的场景。

  • 延迟加载:MyBatis支持延迟加载,减少初始化时的资源消耗。延迟加载是指在需要时才加载数据,而不是在创建对象时就加载。

扩展机制

MyBatis的扩展机制包括:

  • 类型处理器:用于处理Java类型和数据库类型之间的转换。类型处理器可以自定义以支持新的数据类型。

  • 拦截器链:拦截器链允许在执行过程中插入自定义逻辑。拦截器可以用于日志记录、事务管理等。

  • 方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle等。方言支持使得MyBatis能够适应不同的数据库环境。

通过以上对并发编程和MyBatis知识体系的详细描述,我们不仅能够了解到每个知识点的具体内容,还能够看到它们之间的联系和在实际应用中的重要性。这种串联知识的方式有助于我们更好地理解和应用这些技术,实现高效的并发编程和数据处理。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值