并发编程与MyBatis核心解析

📕我是廖志伟,一名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. 线程基础

线程是程序执行的最小单位,它是CPU进行运算调度的基本单位。在Java中,线程是进程的一部分,是进程中的实际运作单位。

(1)线程生命周期

线程从创建到销毁,经历了以下生命周期:

  • 新建(New):使用Thread类或实现Runnable接口创建的线程处于新建状态。此时线程尚未分配CPU时间,也没有执行任何操作。
  • 就绪(Runnable):新建的线程调用start()方法后,进入就绪状态,等待CPU调度。线程就绪状态意味着它具备了运行的条件,但CPU调度器尚未分配给它执行时间。
  • 运行(Running):就绪状态的线程被CPU调度后,进入运行状态。线程在运行状态时,会占用CPU资源执行代码。
  • 阻塞(Blocked):运行状态的线程在执行过程中遇到synchronized关键字或等待某些资源而进入阻塞状态。线程阻塞时,不会占用CPU资源,直到阻塞条件解除。
  • 终止(Terminated):线程执行完毕或调用stop()方法后,进入终止状态。此时线程已经完成所有任务,将释放所有资源。

(2)线程优先级

线程优先级表示线程被CPU调度的优先级,Java中线程优先级分为10个等级,1为最低,10为最高。线程优先级并不能保证其一定被优先执行,只是提高其被调度的概率。线程优先级由操作系统根据线程的优先级策略进行调度。

(3)守护线程

守护线程是服务其他线程的线程,它不属于程序中不可或缺的部分。当所有的非守护线程结束时,程序也就结束了,同时会杀死所有守护线程。可以通过调用setDaemon(true)方法将线程设置为守护线程。在Java虚拟机中,守护线程的终止不会导致虚拟机退出。

(4)线程池

线程池是管理一组线程的容器,用于减少系统创建和销毁线程的开销。Java中,线程池可以使用Executors工厂类来创建。

  • 核心参数配置:核心线程数、最大线程数、线程存活时间、工作队列、拒绝策略。
    • 核心线程数:线程池在空闲时保持的线程数量。
    • 最大线程数:线程池能容纳的最大线程数量。
    • 线程存活时间:线程空闲时间达到此值后,线程将被回收。
    • 工作队列:存放等待执行的任务队列。
    • 拒绝策略:当线程池达到最大线程数时,如何处理新提交的任务。
  • 拒绝策略:CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy。
    • CallerRunsPolicy:调用者运行策略,将任务回退到调用者线程。
    • AbortPolicy:抛出RejectedExecutionException异常。
    • DiscardPolicy:直接丢弃任务。
    • DiscardOldestPolicy:丢弃队列中最旧的任务。
  • 工作队列类型:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue。
    • LinkedBlockingQueue:基于链表的阻塞队列,有容量限制。
    • ArrayBlockingQueue:基于数组的阻塞队列,有容量限制。
    • SynchronousQueue:同步队列,不存储元素,生产者和消费者线程必须一一对应。
  1. 同步机制

(1)悲观锁/乐观锁

悲观锁:在操作数据前先加锁,直到操作完成才释放锁。Java中的synchronized关键字、ReentrantLock等都是悲观锁的实现。

乐观锁:在操作数据前不加锁,通过版本号或时间戳判断数据是否被其他线程修改。Java中的AtomicInteger、AtomicLong等是乐观锁的实现。

(2)读写锁

读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。Java中的ReentrantReadWriteLock是读写锁的实现。

(3)条件变量

条件变量是线程之间进行通信的一种机制。Java中的Condition类提供了await()、signal()、signalAll()等方法。

  1. 并发集合

(1)ConcurrentHashMap

ConcurrentHashMap是Java中线程安全的哈希表,其内部采用分段锁技术,提高了并发性能。

(2)CopyOnWrite容器

CopyOnWrite容器在写操作时,将整个容器复制一份,然后修改新副本,最后将新副本赋值给容器。适用于读多写少的场景。

(3)BlockingQueue

BlockingQueue是线程安全的队列,支持两个操作:put()和take()。当队列为空时,take()操作会阻塞,当队列满时,put()操作会阻塞。

  1. 并发工具类

(1)Phaser

Phaser是Java 8引入的一种并发控制工具,用于协调多个线程的执行顺序。

(2)Exchanger

Exchanger是用于在线程间交换数据的工具,适用于需要在线程间交换数据的场景。

(3)FutureTask

FutureTask是Java中的异步任务,它可以表示一个尚未完成的结果。

  1. 非阻塞算法

非阻塞算法是指在不加锁的情况下,通过其他机制保证数据的一致性。例如,CAS(Compare-And-Swap)算法。

  1. CAS原理

CAS算法是一种无锁算法,通过比较内存中的值和预期值,如果相等,则更新内存中的值。

  1. Atomic类

Atomic类提供了一系列原子操作,如AtomicInteger、AtomicLong等。

  1. 无锁队列

无锁队列是一种线程安全的队列,它使用CAS算法保证线程安全。

  1. 并发框架

(1)Netty线程模型

Netty是Java中高性能的NIO框架,它采用主从多线程模型,提高并发性能。

(2)Akka Actor模型

Akka是Java中一个基于Actor模型的并发框架,它提供了一种简单、可扩展的并发编程模型。

(3)Disruptor环形缓冲区

Disruptor是Java中高性能的并发框架,它使用环形缓冲区和CAS算法实现线程安全。

二、MyBatis知识体系

  1. SQL映射

MyBatis将Java对象与数据库表进行映射,通过映射文件或注解实现。

(1)注解映射

  • @Select、@Insert、@Update、@Delete:用于定义SQL查询、插入、更新、删除操作。
    • @Select:用于定义查询操作,需要指定SQL语句。
    • @Insert:用于定义插入操作,需要指定SQL语句。
    • @Update:用于定义更新操作,需要指定SQL语句。
    • @Delete:用于定义删除操作,需要指定SQL语句。
  • @Results、@Result:用于映射结果集。
    • @Results:用于映射多个结果集,可以包含多个@Result元素。
    • @Result:用于映射单个结果集,需要指定列名和属性名。
  • @One、@Many:用于映射关联查询。
    • @One:用于映射一对一关联查询,需要指定关联的实体类和关联的字段。
    • @Many:用于映射一对多关联查询,需要指定关联的实体类和关联的字段。

(2)结果集映射

  • ResultMap:定义Java对象与数据库表之间的映射关系。
    • ResultMap:用于定义复杂的映射关系,可以包含多个@Result元素。
  • Association、Collection:用于映射关联查询。
    • Association:用于映射一对一关联查询,需要指定关联的实体类和关联的字段。
    • Collection:用于映射一对多关联查询,需要指定关联的实体类和关联的字段。
  1. 动态SQL

MyBatis支持动态SQL,可以根据条件拼接SQL语句。

(1)OGNL表达式

OGNL表达式用于动态SQL中的条件判断、循环等操作。

(2)分支语句

MyBatis支持if、choose、when、otherwise等分支语句。

(3)批量操作

MyBatis支持批量插入、批量删除等操作。

  1. 缓存机制

MyBatis支持一级缓存和二级缓存。

(1)一级缓存

一级缓存是SqlSession级别的缓存,存储最近执行的SQL查询结果。

(2)二级缓存

二级缓存是namespace级别的缓存,存储不同namespace的查询结果。

(3)自定义缓存

MyBatis支持自定义缓存,通过实现Cache接口实现。

  1. 代理模式

MyBatis使用代理模式,通过MapperProxy类实现动态代理。

  1. 插件拦截

MyBatis支持插件拦截,通过实现Interceptor接口实现。

  1. 动态代理执行流程

MyBatis使用动态代理技术,通过Cglib或JDK动态代理实现。

  1. SqlSession生命周期

SqlSession是MyBatis的核心对象,用于执行SQL语句。

  1. 执行器类型

MyBatis提供多种执行器类型,如SimpleExecutor、BatchExecutor、ReuseExecutor等。

  1. 延迟加载

MyBatis支持延迟加载,在查询关联表时,先查询主表,然后延迟加载关联表。

  1. 扩展机制

MyBatis提供多种扩展机制,如类型处理器、拦截器链、方言支持等。

总结:

本文详细介绍了并发编程和MyBatis的相关知识点,包括线程基础、同步机制、并发集合、并发工具类、非阻塞算法、并发框架、SQL映射、动态SQL、缓存机制、代理模式、插件拦截、动态代理执行流程、SqlSession生命周期、执行器类型、延迟加载、扩展机制等。通过本文的介绍,读者可以对并发编程和MyBatis有一个全面、深入的了解,为在实际项目中应用这些技术打下坚实的基础。

CSDN

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值