并发编程知识精要

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

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

Java程序员廖志伟

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

优快云

一、并发编程知识体系

在深入探讨并发编程之前,我们首先需要建立起一个完整的知识体系,这将有助于我们更好地理解和应用相关的概念。

线程基础

线程是程序执行的最小单位,它是操作系统能够进行运算调度的最小单位。在Java中,线程是并发编程的核心。

  1. 线程生命周期:线程从创建到销毁会经历多种状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程状态之间的转换是由线程的调度策略和同步机制共同决定的。例如,当线程尝试获取一个被其他线程持有的锁时,它会进入阻塞状态。

  2. 线程优先级:Java中的线程优先级分为10个等级,优先级高的线程更有可能被CPU调度。线程优先级是线程调度器进行调度的一个参考因素,但它不是绝对的。调度器可能会根据线程的运行状态、CPU的负载情况等因素来调整线程的执行顺序。

  3. 守护线程:守护线程是服务于其他线程的线程,当其他线程结束时,守护线程也会自动结束。在Java虚拟机中,如果有非守护线程正在运行,虚拟机就不会退出。因此,守护线程通常用于执行一些后台任务,如垃圾回收。

  4. 线程池:线程池是管理一组线程的池对象,它可以有效地管理线程资源,提高应用程序的响应速度。线程池的核心参数配置包括核心线程数、最大线程数、线程存活时间、工作队列大小等。线程池的拒绝策略通常包括CallerRunsPolicy、AbortPolicy、DiscardPolicy和DiscardOldestPolicy等。

    • 核心参数配置:核心线程数决定了线程池在运行时保持的线程数量,即使没有任务执行时也会保持这些线程。最大线程数是线程池能创建的最大线程数。线程存活时间是指线程空闲时可以存活的最长时间。工作队列大小决定了线程池在任务等待执行时的最大等待任务数。

    • 拒绝策略:当线程池达到最大线程数时,拒绝策略会决定如何处理新提交的任务。CallerRunsPolicy会在线程池的线程中运行当前任务,而AbortPolicy会抛出一个异常来拒绝任务,DiscardPolicy会简单地丢弃任务,而DiscardOldestPolicy会丢弃队列中最早的未执行任务。

  5. 同步机制

    • 悲观锁/乐观锁:悲观锁假设数据在访问过程中会被修改,因此会锁定数据,而乐观锁则假设数据在访问过程中不会修改,只在修改时进行检测。悲观锁通常使用synchronized关键字或ReentrantLock实现,而乐观锁则使用CAS(Compare-And-Swap)操作。

    • 读写锁:读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。读写锁可以提高读操作的并发性,同时保证写操作的原子性。读写锁的实现通常使用读写锁(ReadWriteLock)接口。

    • 条件变量:条件变量允许线程在某些条件不满足时等待,直到条件被满足时才继续执行。条件变量通常与Object的wait()、notify()和notifyAll()方法一起使用。

  6. 并发集合

    • ConcurrentHashMap:线程安全的HashMap,采用分段锁机制。它将数据分成多个段,每个段有自己的锁,从而允许多个线程同时访问不同的段。

    • CopyOnWrite容器:在写操作时复制底层数据结构,适用于读多写少的场景。每次写操作都会创建一个新的副本,从而避免了对共享数据的并发修改。

  7. BlockingQueue:线程安全的队列,支持生产者-消费者模型。BlockingQueue提供了一系列的阻塞方法,如put()、take()和offer()等,这些方法会在队列满或空时自动阻塞。

  8. 并发工具类

    • Phaser:Phaser是一个可扩展的同步工具,用于线程间的协作。它允许一组线程在执行过程中同步,并支持动态增加或减少参与者。

    • Exchanger:允许两个线程交换数据。当两个线程都准备好交换数据时,Exchanger会交换它们的数据。

    • FutureTask:FutureTask是一个可以异步执行的计算任务。它代表了一个尚未完成的计算任务,并提供了一个方法来获取计算结果。

  9. 非阻塞算法

    • CAS原理:Compare-And-Swap,即比较并交换,是一种无锁操作。它通过原子操作比较内存中的一个值和一个预期的值,如果相等,则将内存中的值替换为新的值。

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

    • 无锁队列:基于CAS原理实现的线程安全队列。它通过原子操作来保证队列的线程安全,从而避免了锁的开销。

  10. 并发框架

    • Netty线程模型:Netty采用主从多线程模型,主线程负责接收连接,从线程负责处理业务逻辑。这种模型可以有效地处理高并发连接。

    • Akka Actor模型:Akka是一个基于Actor模型的高性能并发框架。Actor是一个消息传递的实体,它通过发送和接收消息来执行任务。

    • Disruptor环形缓冲区:Disruptor是一个高性能的并发队列,适用于高并发场景。它使用环形缓冲区和CAS操作来保证线程安全,从而避免了锁的开销。

二、MyBatis知识体系

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

SQL映射
  1. 注解映射:使用注解的方式定义SQL映射关系,简化了XML配置。注解映射通过@Select、@Insert、@Update和@Delete等注解来定义SQL语句。

  2. 结果集映射:将数据库中的数据映射到Java对象中。结果集映射可以通过@Results、@Result和@One、@Many等注解来实现。

  3. 关联查询:支持多表关联查询,将多个表的数据映射到Java对象中。关联查询可以通过@One和@Many注解来实现。

  4. 动态SQL:根据条件动态构建SQL语句。动态SQL可以通过@SelectProvider、@SqlProvider和OGNL表达式来实现。

    • OGNL表达式:用于构建动态SQL,表达式简单易懂。OGNL表达式可以直接访问Java对象的属性和集合。

    • 分支语句:根据条件执行不同的SQL片段。分支语句可以通过 、 、 和 等标签来实现。

    • 批量操作:支持批量插入、更新和删除操作。批量操作可以通过 标签来实现。

  5. 缓存机制

    • 一级缓存:SqlSession级别的缓存,默认开启。一级缓存缓存了从数据库中查询到的数据,当再次查询相同的数据时,可以直接从缓存中获取。

    • 二级缓存:Mapper级别的缓存,需要手动配置。二级缓存缓存了Mapper级别的数据,当再次查询相同的数据时,可以直接从缓存中获取。

    • 自定义缓存:支持自定义缓存实现。自定义缓存可以通过实现Cache接口来实现。

  6. 代理模式:MyBatis使用代理模式实现Mapper接口。代理模式允许在运行时动态创建对象,并拦截对象的调用。

  7. MapperProxy:Mapper接口的代理实现,负责执行SQL语句。MapperProxy通过代理模式实现了Mapper接口,并负责执行SQL语句。

  8. 插件拦截:MyBatis支持插件拦截,可以自定义拦截器实现扩展功能。插件拦截器可以拦截MyBatis的执行过程,如查询、更新、插入和删除等。

  9. 动态代理执行流程

    • 创建MapperProxy代理对象。
    • 执行代理对象的invoke方法。
    • 调用MyBatis的executor执行器。
    • 执行器调用Configuration对象。
    • Configuration对象调用MappedStatement对象。
    • MappedStatement对象执行SQL语句。
  10. SqlSession生命周期

    • 创建SqlSession对象。
    • 使用SqlSession执行数据库操作。
    • 关闭SqlSession对象。
  11. 执行器类型

    • 简单执行器:适用于单条SQL语句的执行。简单执行器直接执行SQL语句,并返回结果。

    • 批量执行器:适用于批量SQL语句的执行。批量执行器将多个SQL语句合并成一个批量操作,从而提高执行效率。

  12. 延迟加载:延迟加载可以在查询数据时只加载需要的数据。延迟加载通过在查询时只加载必要的数据,从而减少数据的加载时间和内存消耗。

  13. 扩展机制

    • 类型处理器:用于处理Java类型和数据库类型之间的转换。类型处理器可以自定义转换规则,从而实现更灵活的数据类型转换。

    • 拦截器链:拦截器链可以拦截MyBatis的执行过程,实现扩展功能。拦截器链可以自定义拦截器,从而实现自定义的扩展功能。

    • 方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle等。方言支持可以通过实现Dialect接口来实现。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值