并发编程与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. 新建(New):线程创建后,尚未启动,此时线程对象已经创建,但尚未执行任何操作。

  2. 就绪(Runnable):线程已经获取到CPU资源,等待被调度执行。此时线程处于就绪队列中,等待CPU调度。

  3. 运行(Running):线程正在执行,此时线程占用CPU资源,执行代码。

  4. 阻塞(Blocked):线程因等待某个资源(如锁、条件变量等)而处于阻塞状态。此时线程被挂起,无法执行。

  5. 死亡(Terminated):线程执行完毕或被强制终止。此时线程不再占用任何资源,可以被垃圾回收器回收。

线程优先级

线程优先级表示线程执行的机会大小,Java线程的优先级分为以下几种:

  1. MAX_PRIORITY:最高优先级,线程有最高的执行机会。

  2. MIN_PRIORITY:最低优先级,线程有最低的执行机会。

  3. NORM_PRIORITY:默认优先级,大多数线程的优先级。

守护线程

守护线程是一种特殊的线程,其生命周期依赖于主线程。当所有非守护线程结束时,守护线程也会自动结束。Java虚拟机在退出时,如果没有存活线程,即使有守护线程也会退出。

线程池

线程池是一种管理线程的方法,它可以提高程序性能,减少创建和销毁线程的开销。线程池的核心参数配置如下:

  1. 核心线程数:线程池在运行时始终存在的线程数。

  2. 最大线程数:线程池允许的最大线程数。

  3. 队列容量:等待执行的线程存储在队列中的最大数量。

  4. 拒绝策略:当任务数量超过队列容量时,如何处理新任务。

工作队列类型

线程池的工作队列有以下几种类型:

  1. 队列(ArrayBlockingQueue、LinkedBlockingQueue):存储等待执行的线程任务。

  2. 队列(PriorityBlockingQueue):根据优先级存储等待执行的线程任务。

  3. 队列(SynchronousQueue):不存储任务,任务直接传递给线程。

同步机制

同步机制是确保线程安全的关键技术,主要包括以下几种:

  1. 悲观锁:假设多个线程会同时访问共享资源,因此在访问共享资源时,必须加锁。

  2. 乐观锁:假设多个线程不会同时访问共享资源,因此采用无锁的方式访问共享资源,当发现冲突时,进行相应的处理。

  3. 读写锁:允许多个线程同时读取共享资源,但只有一个线程可以写入共享资源。

  4. 条件变量:线程在等待某个条件成立时,可以挂起当前线程,当条件成立时,被挂起的线程会自动唤醒。

并发集合

Java并发集合是为了提高多线程环境下集合操作的性能而设计的,主要包括以下几种:

  1. ConcurrentHashMap:线程安全的HashMap,通过分段锁实现线程安全。

  2. CopyOnWriteArrayList:线程安全的ArrayList,适用于读多写少的场景,通过复制整个底层数组实现线程安全。

  3. CopyOnWriteArraySet:线程安全的HashSet,适用于读多写少的场景,通过复制整个底层数组实现线程安全。

并发工具类

以下是一些常用的并发工具类:

  1. Phaser:用于协调多个线程的执行,实现线程间的同步。

  2. Exchanger:用于交换两个线程的数据。

  3. FutureTask:表示异步计算的结果。

  4. 非阻塞算法:如CompareAndSwap(CAS)等。

CAS原理

CAS(Compare And Swap)是一种无锁算法,用于实现线程安全。其原理如下:

  1. 比较当前值与预期值。

  2. 如果相等,则将新值赋给当前值。

  3. 否则,不做任何操作。

Atomic类

Atomic类提供了一系列线程安全的原子操作,包括:

  1. AtomicBoolean:线程安全的布尔值。

  2. AtomicInteger:线程安全的整数。

  3. AtomicLong:线程安全的长整数。

  4. AtomicReference:线程安全的引用。

无锁队列

无锁队列是一种基于CAS原理的线程安全队列,如ConcurrentLinkedQueue。

并发框架

以下是一些常用的并发框架:

  1. Netty:基于NIO的异步事件驱动的网络应用框架,适用于构建高性能、高并发的网络应用。

  2. Akka:基于actor模型的并发框架,适用于构建分布式、高并发的系统。

  3. Disruptor:环形缓冲区,适用于高并发场景,通过环形队列和CAS操作实现线程安全。

二、MyBatis知识体系

SQL映射

MyBatis通过XML或注解的方式实现SQL映射,将Java对象与数据库表进行映射。在XML映射文件中,可以使用

  • 、、、等标签定义SQL语句,并通过标签定义Java对象与数据库表的映射关系。 注解映射 MyBatis支持以下注解进行映射: @Select:表示查询操作。 @Insert:表示插入操作。 @Update:表示更新操作。 @Delete:表示删除操作。 结果集映射 MyBatis通过ResultMap将Java对象与数据库表进行映射。ResultMap定义了每个字段在数据库表中的映射关系,以及如何将结果集映射到Java对象中。 关联查询 MyBatis支持以下关联查询方式: 一对一:通过@One注解实现。 一对多:通过@Many注解实现。 多对多:通过@Many注解实现。 动态SQL MyBatis支持动态SQL,可以根据条件动态生成SQL语句。通过、、、等标签实现条件判断,动态拼接SQL语句。 OGNL表达式 OGNL表达式用于动态生成SQL语句,如#{name}表示参数,${value}表示变量。 分支语句 MyBatis支持分支语句,如、、、等标签,实现条件判断和分支执行。 批量操作 MyBatis支持批量操作,如标签,循环遍历集合,实现批量插入、更新、删除等操作。 缓存机制 MyBatis支持一级缓存和二级缓存。 一级缓存:会话缓存,用于缓存当前会话中的查询结果。 二级缓存:全局缓存,用于缓存整个应用程序的查询结果。 自定义缓存 MyBatis支持自定义缓存,通过实现Cache接口实现。自定义缓存可以存储更复杂的数据结构,满足特定需求。 代理模式 MyBatis使用代理模式实现动态代理,如MapperProxy。通过动态代理,MyBatis可以在运行时生成代理对象,代理对象负责调用实际的方法,并处理事务、缓存等逻辑。 插件拦截 MyBatis支持插件拦截,通过实现Interceptor接口实现。插件可以拦截SQL执行过程,实现日志记录、性能监控等功能。 动态代理执行流程 MyBatis使用动态代理实现Mapper接口,通过反射调用实际的方法。动态代理执行流程如下: 调用Mapper接口的方法。 动态代理拦截调用,生成代理对象。 代理对象调用实际的方法。 处理事务、缓存等逻辑。 SqlSession生命周期 SqlSession是MyBatis的核心对象,负责执行SQL语句,管理事务。SqlSession的生命周期包括以下阶段: 创建SqlSession。 使用SqlSession执行SQL语句。 关闭SqlSession。 执行器类型 MyBatis支持以下执行器类型: SimpleExecutor:简单执行器,适用于单条SQL语句执行。 ReuseExecutor:重用执行器,适用于批量SQL语句执行。 BatchExecutor:批量执行器,适用于批量插入、更新、删除等操作。 延迟加载 MyBatis支持延迟加载,用于提高程序性能。延迟加载是指在需要时才加载关联数据,减少初始加载的数据量。 扩展机制 MyBatis支持扩展机制,如TypeHandler、Interceptor等。TypeHandler用于将Java类型与数据库类型进行转换,Interceptor用于拦截SQL执行过程。 类型处理器 MyBatis支持类型处理器,用于将Java类型与数据库类型进行转换。类型处理器可以在运行时动态注册,满足特定需求。 拦截器链 MyBatis支持拦截器链,用于拦截SQL执行过程。拦截器链可以包含多个拦截器,实现不同的功能。 方言支持 MyBatis支持方言,如MySQL、Oracle等。方言可以根据数据库的特点,优化SQL语句的执行。 总结 本文详细介绍了并发编程和MyBatis的知识体系,包括线程基础、线程池、同步机制、并发集合、并发工具类、并发框架、SQL映射、动态SQL、缓存机制、插件拦截、动态代理执行流程、SqlSession生命周期、执行器类型、延迟加载、扩展机制、类型处理器、拦截器链、方言支持等知识点。通过对这些知识点的学习,读者可以深入了解并发编程和MyBatis的原理和应用,为实际开发提供有力支持。 博主分享📥博主的人生感悟和目标📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。《Java项目实战—深入理解大型互联网企业通用技术》基础篇的购书链接:https://item.jd.com/14152451.html《Java项目实战—深入理解大型互联网企业通用技术》基础篇繁体字的购书链接:http://product.dangdang.com/11821397208.html《Java项目实战—深入理解大型互联网企业通用技术》进阶篇的购书链接:https://item.jd.com/14616418.html《Java项目实战—深入理解大型互联网企业通用技术》架构篇待上架《解密程序员的思维密码--沟通、演讲、思考的实践》购书链接:https://item.jd.com/15096040.html面试备战资料八股文备战场景描述链接时间充裕(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.csdn.net/download/java_wxid/91148718希望各位读者朋友能够多多支持!现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!💂 博客主页: Java程序员廖志伟👉 开源项目:Java程序员廖志伟🌥 哔哩哔哩:Java程序员廖志伟🎏 个人社区:Java程序员廖志伟🔖 个人微信号: SeniorRD🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
  • 资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在 IT 领域,Web 服务是一种借助网络实现通信的软件系统,通常以 XML 作为数据交换格式。WSDL 是一种用于描述 Web 服务的标准语言,它明确了服务的位置、接口以及调用方式等关键信息。本文将深入探讨如何依据 WSDL 地址调用 WebService 接口,并介绍相关工具的应用。 首先,WSDL 文件本质上是一个 XML 文档,详细规定了服务提供方消费方的交互细节,涵盖服务地址、消息格式、操作以及服务契约等内容。借助 WSDL,开发者能够清楚知晓如何 Web 服务进行交互,包括输入输出消息的具体结构。 其次,SOAP 是 Web 服务常用的传输协议,它在 HTTP、SMTP 等基础协议之上对 XML 消息进行封装。WSDL 中定义的服务操作一般对应于 SOAP 消息中的方法。 要调用 Web 服务,开发者通常需要一个客户端代理类,该类封装了服务交互的所有逻辑。当下多数开发环境都提供了从 WSDL 自动生成代理类的工具。比如在 Java 环境中,可利用 Apache CXF、Axis2 等库,或者借助 Maven 的 wsimport 插件来实现。在 .NET 环境下,Visual Studio 能够直接从 WSDL 生成服务引用。 生成代理类后,调用 Web 服务就如同调用本地方法一样便捷。以 Java 为例,创建代理类实例后,即可调用其方法并传递相应参数。在 .NET 中,创建服务代理对象后,也能通过它来调用服务方法。 文中提到的“源码 工具”标签,可能涉及一些协助开发者处理 WSDL 的工具。例如,SoapUI 是一款广受欢迎的测试工具,可用于测试 Web 服务,包括基于 WSDL 创建测试用例。此外,wsdl2java 和 wsdl2dotnet 分别是 Java
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值