并发编程与MyBatis核心解析

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

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

\n

一、并发编程知识体系

线程基础

  1. 线程生命周期

线程的生命周期主要包括以下状态:

(1)新建(New):线程对象被创建后处于该状态。

(2)就绪(Runnable):线程获得CPU时间资源,等待被调度。

(3)运行(Running):线程被CPU调度执行。

(4)阻塞(Blocked):线程因等待某个资源而暂时无法运行。

(5)等待(Waiting):线程在等待某个条件成立时进入等待状态。

(6)超时等待(Timed Waiting):线程在等待某个条件成立时,设置超时时间。

(7)终止(Terminated):线程执行完毕或被强制终止。

  1. 线程优先级

线程优先级分为以下级别:

(1)最低优先级(MIN_PRIORITY):线程优先级最低。

(2)较低优先级(LOWER_PRIORITY):低于普通优先级。

(3)普通优先级(NORM_PRIORITY):默认优先级。

(4)较高优先级(HIGHER_PRIORITY):高于普通优先级。

(5)最高优先级(MAX_PRIORITY):线程优先级最高。

  1. 守护线程

守护线程是一种在后台为其他线程服务的线程。当所有的非守护线程结束时,程序将退出。

  1. 线程池

线程池的核心实现机制如下:

(1)核心线程数:线程池维护的核心线程数,即使没有任务执行,这些线程也会一直在线程池中。

(2)最大线程数:线程池可以拥有的最大线程数,当任务数量超过核心线程数时,会创建新线程。

(3)存活时间:线程没有任务执行时存活的时间,超过这个时间线程会被回收。

(4)拒绝策略:当任务数量超过线程池的最大线程数时,线程池会采用拒绝策略来处理新任务。

  1. 工作队列类型

(1)LinkedBlockingQueue:基于链表的阻塞队列,适用于生产者消费者模型。

(2)ArrayBlockingQueue:基于数组的阻塞队列,固定大小的队列。

(3)SynchronousQueue:同步队列,适用于高并发场景。

同步机制

  1. 悲观锁/乐观锁

悲观锁实现方式:

(1)使用synchronized关键字或ReentrantLock等锁机制。

(2)在修改数据前,先锁定资源。

乐观锁实现方式:

(1)使用版本号或时间戳。

(2)在修改数据时,检查版本号或时间戳是否发生变化。

  1. 读写锁

读写锁实现方式:

(1)使用ReentrantReadWriteLock。

(2)允许多个线程同时读取数据,但只允许一个线程写入数据。

  1. 条件变量

条件变量实现方式:

(1)使用Condition对象。

(2)线程在某个条件不满足时等待,直到条件满足时被唤醒。

并发集合

  1. ConcurrentHashMap

ConcurrentHashMap基于分段锁技术实现,将数据分为多个段,每个段有自己的锁。

  1. CopyOnWrite容器

CopyOnWrite容器在写操作时复制整个底层数据结构,适用于读多写少的场景。

  1. BlockingQueue

BlockingQueue支持线程间阻塞操作的生产者消费者队列。

并发工具类

  1. Phaser

Phaser用于协调多个线程的执行顺序,通过注册和到达阶段来实现。

  1. Exchanger

Exchanger用于两个线程交换数据。

  1. FutureTask

FutureTask用于异步执行任务,并返回结果。

非阻塞算法

非阻塞算法利用CAS(Compare and Swap)原理实现,通过原子操作保证数据的一致性。

CAS原理

CAS操作包括三个操作数:内存位置V、预期原值A和新值B。当内存位置的值与预期原值A相同时,更新内存位置的值为新值B,否则不做任何操作。

Atomic类

  1. AtomicInteger

AtomicInteger提供原子操作,如getAndIncrement、getAndDecrement等。

  1. AtomicLong

AtomicLong提供原子操作,如getAndAdd、getAndSubtract等。

  1. AtomicReference

AtomicReference提供原子操作,如compareAndSet、getAndSet等。

无锁队列

无锁队列是一种基于CAS原理的并发队列,如ConcurrentLinkedQueue。

并发框架

  1. Netty

Netty使用NIO(非阻塞IO)技术实现,提供高性能、可伸缩的网络通信框架。

  1. Akka Actor模型

Akka Actor模型是一种基于消息传递的并发模型,适用于构建分布式、高并发的应用。

  1. Disruptor环形缓冲区

Disruptor环形缓冲区提供高性能、低延迟的消息队列,适用于高并发场景。

二、MyBatis知识体系

SQL映射

  1. 注解映射

MyBatis注解映射包括:

(1)@Select:用于定义查询SQL。

(2)@Insert:用于定义插入SQL。

(3)@Update:用于定义更新SQL。

(4)@Delete:用于定义删除SQL。

  1. 结果集映射

MyBatis通过TypeHandler将数据库中的结果集映射到Java对象。

关联查询

  1. @One

@One用于实现一对一关联查询。

  1. @Many

@Many用于实现一对多关联查询。

动态SQL

  1. OGNL表达式

OGNL表达式用于动态构建SQL语句。

  1. 分支语句

分支语句用于动态构建SQL语句。

  1. 批量操作

批量操作用于动态构建SQL语句。

缓存机制

  1. 一级缓存

一级缓存缓存SqlSession中查询的结果。

  1. 二级缓存

二级缓存缓存同一个namespace中查询的结果。

自定义缓存

  1. 实现Cache接口

自定义缓存需要实现Cache接口。

代理模式

  1. MapperProxy

MapperProxy是实现Mapper接口动态代理的类。

插件拦截

  1. 实现Interceptor接口

插件拦截需要实现Interceptor接口。

动态代理执行流程

  1. Cglib或JDK动态代理

MyBatis通过Cglib或JDK动态代理实现Mapper接口的动态代理。

SqlSession生命周期

  1. 创建、使用和关闭

SqlSession的生命周期包括创建、使用和关闭。

执行器类型

  1. SimpleExecutor

SimpleExecutor执行器适用于简单场景。

  1. ReuseExecutor

ReuseExecutor执行器适用于需要复用数据库连接的场景。

  1. BatchExecutor

BatchExecutor执行器适用于批量操作场景。

延迟加载

  1. 在需要时才加载关联数据

MyBatis支持延迟加载,在需要时才加载关联数据。

扩展机制

  1. 类型处理器

MyBatis提供了类型处理器,用于将数据库中的数据类型转换为Java对象类型。

  1. 拦截器链

MyBatis拦截器链允许在执行SQL语句前后添加拦截器,实现自定义逻辑。

  1. 方言支持

MyBatis支持多种数据库方言,如MySQL、Oracle、SQLServer等。

通过以上知识点的介绍,我们可以更好地理解和应用并发编程和MyBatis,提高程序的性能和可维护性。在实际开发过程中,我们需要根据具体场景选择合适的并发编程模型和MyBatis配置,以达到最佳的性能和效果。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值