Java并发编程精要

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

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

Java程序员廖志伟

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

CSDN

一、并发编程知识体系

  1. 线程基础

线程是程序执行的最小单位,它是操作系统能够进行运算调度的基本单位。线程的基础实现涉及操作系统的调度算法,例如时间片轮转、优先级调度等。线程生命周期包括创建、就绪、运行、阻塞、终止等状态,这些状态之间的转换受到线程调度策略和线程行为的影响。

  • 线程生命周期:在Java中,线程的创建通常通过Thread类或Runnable接口实现。线程的创建后进入就绪状态,等待CPU时间片。运行状态表示线程正在执行任务,阻塞状态可能由于I/O操作、等待锁等导致,而终止状态则表示线程执行完毕或被异常终止。

  • 线程优先级:Java中线程优先级分为1到10共10个等级,优先级高的线程更有可能获得CPU时间片。优先级调度算法通常与线程的执行时间、系统负载等因素相关。

  • 守护线程:守护线程(Daemon Thread)是一种特殊的线程,当所有非守护线程执行完毕后,程序将自动退出。守护线程通常用于执行后台任务,如垃圾回收。

  • 线程池:线程池通过复用一定数量的线程来执行任务,减少了线程创建和销毁的开销。线程池的核心参数配置包括核心线程数、最大线程数、队列类型和拒绝策略等。

  1. 核心参数配置

线程池的核心参数配置对线程池的性能和稳定性至关重要。

  • 核心线程数:核心线程数决定了线程池在空闲时保持的线程数量,它应与系统的CPU核心数相匹配,以充分利用系统资源。

  • 最大线程数:最大线程数限制了线程池能创建的最大线程数,它应考虑系统的资源限制和任务执行的特点。

  • 队列类型:工作队列用于存放等待执行的任务,常见的队列类型包括阻塞队列和非阻塞队列。阻塞队列在任务数量超过线程数时,会阻塞任务提交,而非阻塞队列则允许任务在队列满时直接被拒绝。

  • 拒绝策略:拒绝策略定义了当线程池无法处理新提交的任务时的行为,常见的策略包括AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行)、DiscardPolicy(丢弃任务)和DiscardOldestPolicy(丢弃最旧任务)。

  1. 同步机制

同步机制确保多个线程在访问共享资源时不会产生冲突。

  • 悲观锁:悲观锁假定数据在任一时刻都可能被修改,因此在操作数据前必须加锁。Java中的synchronized关键字和ReentrantLock类提供了悲观锁的实现。

  • 乐观锁:乐观锁假定数据在任一时刻可能不会被修改,因此在操作数据时不加锁,而是在更新数据时通过版本号或其他机制检查数据是否被修改。

  • 读写锁:读写锁允许多个线程同时读取数据,但在写数据时,需要独占访问。Java中的ReentrantReadWriteLock类提供了读写锁的实现。

  1. 并发集合

并发集合是为并发环境设计的集合类,能够支持多线程并发访问。

  • ConcurrentHashMap:ConcurrentHashMap是线程安全的HashMap,它通过分段锁(Segment Locking)技术实现了高并发性能。每个段包含一个小的锁,多个段可以并行访问,从而提高了并发处理能力。

  • CopyOnWrite容器:CopyOnWriteArrayListCopyOnWriteArraySet等容器在数据被修改时,会创建一个数据的副本,避免多个线程同时修改同一份数据,适用于读多写少的场景。

  1. 并发工具类

并发工具类提供了多种用于线程同步和并发控制的工具。

  • Phaser:Phaser是一个灵活的线程同步工具,它允许线程在某个点等待其他线程,并支持动态增加参与者。

  • Exchanger:Exchanger允许两个线程在某个点交换数据,适用于需要线程间数据交换的场景。

  • FutureTask:FutureTask是一个可以异步执行任务的类,它提供了get()方法来获取执行结果。

  1. 非阻塞算法

非阻塞算法通过无锁编程技术实现线程之间的同步。

  • CAS(Compare-And-Swap):CAS操作通过原子地比较和交换内存位置的值来实现无锁同步。

  • Atomic类:AtomicIntegerAtomicLong等类提供了原子操作,如原子增加、比较和交换等。

  • 无锁队列:无锁队列通过CAS操作和循环链表等数据结构实现线程安全,适用于高并发场景。

  1. 并发框架

并发框架提供了高级的并发编程抽象和工具。

  • Netty线程模型:Netty采用主从多线程模型,主线程负责处理连接和读写事件,从线程负责业务逻辑处理,提高了并发性能。

  • Akka Actor模型:Akka基于Actor模型,将并发编程抽象为消息传递,支持高并发、高可用、高容错。

  • Disruptor环形缓冲区:Disruptor使用环形缓冲区来存储数据,通过CAS操作实现生产者-消费者模型,提供了高性能的并发队列。

二、MyBatis知识体系

  1. SQL映射

SQL映射是MyBatis的核心功能之一,它将Java对象与数据库表之间的映射关系进行定义。

  • 注解映射:MyBatis支持使用注解来定义SQL映射,如@Select@Insert等,简化了映射过程。

  • 结果集映射:MyBatis通过ResultMap定义了Java对象与数据库表列之间的映射关系,支持自定义结果集处理。

  • 关联查询:MyBatis支持一对一、一对多、多对多等关联查询,通过嵌套查询或联合查询实现。

  1. 动态SQL

动态SQL允许根据条件动态生成SQL语句。

  • OGNL表达式:OGNL(Object-Graph Navigation Language)是一种表达式语言,用于动态生成SQL语句。

  • 分支语句:MyBatis支持使用<if><choose>等标签实现条件分支的SQL语句。

  • 批量操作:MyBatis支持使用<foreach>标签实现批量插入或更新操作。

  1. 缓存机制

MyBatis提供了缓存机制,提高查询性能。

  • 一级缓存:SqlSession级别的缓存,存储最近执行的SQL语句及其结果。

  • 二级缓存:全局缓存,存储相同命名空间下的相同SQL语句及其结果。

  • 自定义缓存:MyBatis支持自定义缓存实现,如Ehcache、Redis等。

  1. 代理模式

MyBatis使用代理模式生成Mapper接口的代理实现。

  • MapperProxy:MyBatis中的MapperProxy实现了InvocationHandler接口,用于生成动态代理。

  • 插件拦截:MyBatis插件可以拦截MyBatis的执行流程,实现自定义功能。

  • 动态代理:通过Java的反射机制动态创建代理对象。

  1. 执行流程

MyBatis的执行流程包括SqlSession的生命周期、执行器类型和延迟加载等。

  • SqlSession生命周期:SqlSession的创建、使用和关闭涉及数据库连接的管理。

  • 执行器类型:MyBatis提供了多种执行器类型,如SimpleExecutor、ReuseExecutor等,影响SQL执行的性能。

  • 延迟加载:MyBatis支持延迟加载,即在需要时才加载对象,提高性能。

  1. 扩展机制

MyBatis提供了扩展机制,允许开发者自定义功能。

  • 类型处理器:MyBatis的类型处理器负责处理Java类型与数据库类型之间的转换。

  • 拦截器链:MyBatis的拦截器链可以拦截MyBatis的执行流程,实现自定义功能。

  • 方言支持:MyBatis支持不同数据库的SQL语法,通过方言实现。

总结:

并发编程和MyBatis是Java开发中重要的知识点,掌握这些知识可以帮助我们写出高性能、高可用的代码。在并发编程中,我们需要深入理解线程基础、同步机制、并发集合、并发工具类等技术的实现细节;在MyBatis中,我们需要掌握SQL映射、动态SQL、缓存机制、代理模式、执行流程、扩展机制等技术的实现细节。通过学习这些知识点,我们可以更好地应对实际开发中的挑战。

CSDN

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值