并发编程核心知识

📕我是廖志伟,一名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

一、并发编程知识体系

并发编程是现代计算机科学中一个重要的领域,它涉及如何让计算机程序同时处理多个任务。以下是对并发编程知识体系的详细描述,旨在提供一个专业且通俗易懂的理解。

线程基础

线程是并发编程的核心概念,它是程序执行的最小单位。以下是线程基础知识的概述:

  • 线程生命周期:线程从创建(创建状态)、就绪(就绪状态)、运行(运行状态)、阻塞(阻塞状态)到终止(终止状态),每个状态都有其特定的意义和转换条件。例如,当线程正在等待某个资源时,它会进入阻塞状态;当资源可用时,线程会从阻塞状态转变为就绪状态,等待CPU调度。

  • 线程优先级:线程优先级决定了线程在多线程环境中的执行顺序。线程优先级通常在创建线程时设定,操作系统会根据线程的优先级和CPU的使用情况进行调度。

  • 守护线程:守护线程是服务其他线程的线程,它不会阻止程序退出。例如,垃圾回收线程就是一个守护线程。

  • 线程池:线程池是管理一组线程的集合,它可以提高应用程序的响应速度和资源利用率。线程池中的线程可以重复使用,避免了频繁创建和销毁线程的开销。

核心参数配置、拒绝策略、工作队列类型
  • 核心参数配置:包括线程的名称、优先级、守护状态、栈大小等。线程的栈大小决定了线程可以使用的内存空间。

  • 拒绝策略:当线程池中的线程数量达到最大值时,如何处理新提交的任务。常见的拒绝策略包括:CallerRunsPolicy(调用者运行策略)、AbortPolicy(抛出异常策略)、DiscardPolicy(丢弃策略)和DiscardOldestPolicy(丢弃最旧策略)。

  • 工作队列类型:线程池的工作队列决定了任务如何被存储和调度。常见的工作队列类型包括:LinkedBlockingQueue(链式阻塞队列)、ArrayBlockingQueue(数组阻塞队列)和SynchronousQueue(同步队列)。

同步机制

同步机制确保了多个线程之间的数据一致性,以下是几种常见的同步机制:

  • 悲观锁/乐观锁:悲观锁假设冲突很可能会发生,因此总是先锁定资源;乐观锁假设冲突很少发生,只在更新时检查冲突。在实现上,悲观锁通常使用互斥锁(如synchronized关键字或ReentrantLock),乐观锁则使用原子变量或CAS操作。

  • 读写锁:读写锁允许多个读操作同时进行,但写操作会独占锁。在实现上,读写锁通常使用共享锁和独占锁的概念,通过锁的粒度和粒度控制机制来实现。

  • 条件变量:条件变量允许线程在某些条件下等待,直到其他线程通知它们继续执行。在实现上,条件变量通常与互斥锁结合使用,线程在等待条件变量时会被阻塞,并在条件变量满足时被唤醒。

并发集合

并发集合是专门为并发环境设计的集合类,以下是一些常见的并发集合:

  • ConcurrentHashMap:线程安全的HashMap实现,通过分段锁(Segment Lock)来减少锁的竞争。

  • CopyOnWrite容器:在写操作时复制整个容器,适用于读多写少的场景。在实现上,每次写操作都会创建一个新的容器副本。

  • BlockingQueue:阻塞队列,支持线程间的生产者-消费者模式。在实现上,BlockingQueue内部通常使用循环数组或链表来存储元素,并使用锁或条件变量来保证线程安全。

并发工具类
  • Phaser:用于协调多个线程的执行,类似于计数器。在实现上,Phaser维护一个计数器,线程在执行前需要注册,并在执行完毕后减少计数器。

  • Exchanger:允许两个线程交换数据。在实现上,Exchanger是一个线程安全的对象,两个线程可以将其对象传递给对方,并等待对方传递对象回来。

  • FutureTask:代表异步计算的结果。在实现上,FutureTask封装了一个Runnable任务,并提供方法来获取任务的结果。

非阻塞算法

非阻塞算法通过原子操作和内存屏障技术实现,以下是一些关键概念:

  • CAS原理:比较并交换(Compare-And-Swap),是一种无锁算法。在实现上,CAS操作通常使用硬件提供的原子指令。

  • Atomic类:提供原子操作的类,如AtomicInteger、AtomicLong等。在实现上,这些类通常基于CAS操作。

  • 无锁队列:使用CAS操作实现的无锁队列。在实现上,无锁队列通过原子操作来保证线程安全,避免了锁的开销。

并发框架
  • Netty线程模型:Netty采用主从多线程模型,提高了网络应用程序的并发性能。在实现上,Netty使用一个主线程(Boss线程)负责接收客户端连接请求,多个工作线程(Worker线程)负责处理实际的读写操作。

  • Akka Actor模型:基于Actor模型,每个Actor独立运行,具有并发性和容错性。在实现上,Akka使用Actor系统来管理Actor的生命周期和消息传递。

  • Disruptor环形缓冲区:Disruptor是一个高性能的并发队列,基于环形缓冲区实现。在实现上,Disruptor使用内存屏障和CAS操作来保证线程安全。

二、MyBatis知识体系

MyBatis是一个流行的持久层框架,它简化了数据库操作。以下是MyBatis知识体系的详细描述。

SQL映射
  • 注解映射:使用注解来映射SQL语句和结果集。例如,可以使用@Select、@Result等注解来定义SQL语句和结果集的映射关系。

  • 结果集映射:定义如何将数据库结果集映射到Java对象。在实现上,MyBatis使用XML文件或注解来定义结果集映射规则。

  • 关联查询:处理多表之间的关联关系。在实现上,MyBatis使用嵌套的SQL语句或关联查询来实现多表之间的关联。

动态SQL
  • OGNL表达式:用于动态生成SQL语句。在实现上,OGNL表达式可以访问Java对象和静态数据。

  • 分支语句:根据条件动态选择不同的SQL语句。在实现上,MyBatis使用 、 、 等标签来定义分支语句。

  • 批量操作:支持批量插入、更新和删除操作。在实现上,MyBatis使用特殊的SQL语句或XML标签来定义批量操作。

缓存机制
  • 一级缓存:SqlSession级别的缓存,用于缓存最近执行过的查询结果。在实现上,MyBatis使用HashMap来存储缓存数据。

  • 二级缓存:全局缓存,可以跨SqlSession使用。在实现上,MyBatis使用不同类型的缓存实现,如Ehcache、Redis等。

  • 自定义缓存:自定义缓存实现,扩展MyBatis缓存机制。在实现上,可以通过实现Cache接口来自定义缓存。

  • 代理模式:使用代理模式实现缓存的透明化。在实现上,MyBatis使用动态代理技术来生成代理对象,代理对象在执行方法时会检查缓存。

MapperProxy插件拦截、动态代理、执行流程
  • MapperProxy:MyBatis的内部代理,用于拦截Mapper接口的方法。在实现上,MyBatis使用CGLib或JDK动态代理技术来生成代理对象。

  • 插件拦截:通过插件机制拦截SQL执行过程,实现功能扩展。在实现上,MyBatis使用代理对象来拦截方法调用,并执行插件的逻辑。

  • 动态代理:使用动态代理技术生成Mapper接口的代理实例。在实现上,MyBatis使用动态代理技术来生成代理对象。

  • 执行流程:MyBatis的SQL执行流程,包括解析、绑定参数、执行SQL、结果映射等。在实现上,MyBatis使用XML配置文件来定义SQL语句和结果集映射规则。

SqlSession生命周期、执行器类型、延迟加载、扩展机制
  • SqlSession生命周期:SqlSession的创建、使用和关闭过程。在实现上,MyBatis使用代理模式来管理SqlSession的生命周期。

  • 执行器类型:MyBatis的执行器类型,如SimpleExecutor和ReuseExecutor。在实现上,执行器负责解析SQL语句、绑定参数、执行SQL和获取结果集。

  • 延迟加载:按需加载关联对象,提高性能。在实现上,MyBatis使用懒加载技术来延迟加载关联对象。

  • 扩展机制:MyBatis的扩展机制,如自定义插件、拦截器等。在实现上,MyBatis提供了一系列接口和注解,方便用户自定义扩展功能。

类型处理器、拦截器链、方言支持
  • 类型处理器:MyBatis的类型处理器用于处理Java类型和数据库类型之间的转换。在实现上,MyBatis使用类型处理器来转换Java类型和数据库类型。

  • 拦截器链:拦截器链用于拦截SQL执行过程,实现功能扩展。在实现上,MyBatis使用拦截器链来拦截SQL执行过程。

  • 方言支持:MyBatis支持多种数据库方言,如MySQL、Oracle等。在实现上,MyBatis使用XML文件或注解来定义不同的数据库方言。

CSDN

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

内容概要:本书《Deep Reinforcement Learning with Guaranteed Performance》探讨了基于李雅普诺夫方法的深度强化学习及其在非线性系统最优控制中的应用。书中提出了一种近似最优自适应控制方法,结合泰勒展开、神经网络、估计器设计及滑模控制思想,解决了不同场景下的跟踪控制问题。该方法不仅保证了性能指标的渐近收敛,还确保了跟踪误差的渐近收敛至零。此外,书中还涉及了执行器饱和、冗余解析等问题,并提出了新的冗余解析方法,验证了所提方法的有效性和优越性。 适合人群:研究生及以上学历的研究人员,特别是从事自适应/最优控制、机器人学和动态神经网络领域的学术界和工业界研究人员。 使用场景及目标:①研究非线性系统的最优控制问题,特别是在存在输入约束和系统动力学的情况下;②解决带有参数不确定性的线性和非线性系统的跟踪控制问题;③探索基于李雅普诺夫方法的深度强化学习在非线性系统控制中的应用;④设计和验证针对冗余机械臂的新型冗余解析方法。 其他说明:本书分为七章,每章内容相对独立,便于读者理解。书中不仅提供了理论分析,还通过实际应用(如欠驱动船舶、冗余机械臂)验证了所提方法的有效性。此外,作者鼓励读者通过仿真和实验进一步验证书中提出的理论和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值