📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。
🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。
一、并发编程知识体系
线程基础 线程是并发编程的核心,它允许程序同时执行多个任务。在Java中,线程是通过Thread类来创建和管理的。线程的创建可以通过继承Thread类或实现Runnable接口来实现。线程的生命周期管理包括线程的启动、暂停、恢复和终止等操作。线程状态的变化是线程管理的关键点,Java线程的生命周期包括新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)六个状态。
线程优先级 线程优先级是操作系统调度线程执行的一个重要依据。在Java中,线程优先级分为10个等级,从1(最低)到10(最高)。线程的优先级越高,被CPU调度的概率越大。但是,线程优先级并不能保证线程一定会被优先执行,它只是给线程调度提供了一个优先级的参考。
守护线程 守护线程(Daemon Thread)是一种特殊的线程,它依赖于其他线程而运行。当所有非守护线程结束时,守护线程也会随之结束。在Java应用程序中,通常使用守护线程来执行一些后台任务,如垃圾回收器。
线程池 线程池是管理一组线程的容器,它可以减少创建线程的开销,提高应用程序的响应速度。线程池的核心参数配置包括核心线程数、最大线程数、线程存活时间、工作队列和拒绝策略。工作队列用于存放等待执行的任务,常见的队列有LinkedBlockingQueue、ArrayBlockingQueue等。
拒绝策略 当线程池中的线程数量达到最大值时,拒绝策略决定了如何处理新提交的任务。常见的拒绝策略有AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃最老的任务)等。
同步机制 同步机制是确保线程安全的重要手段。在Java中,常用的同步机制包括synchronized关键字、ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等。这些机制可以保证在同一时刻只有一个线程能够访问共享资源。
悲观锁/乐观锁 悲观锁和乐观锁是两种处理并发问题的策略。悲观锁假设并发操作会导致冲突,因此在操作开始时就加锁;乐观锁则假设并发操作不会导致冲突,只有在操作完成后才检查是否需要加锁。在Java中,可以使用synchronized关键字实现悲观锁,而乐观锁可以通过CAS(Compare-And-Swap)操作实现。
读写锁 读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。读锁和写锁可以同时存在,但写锁会阻塞其他所有读锁和写锁。在Java中,可以使用ReentrantReadWriteLock实现读写锁。
条件变量 条件变量是一种线程间的通信机制,用于在线程之间传递条件。线程可以等待某个条件成立,或者通知其他线程某个条件成立。在Java中,可以使用Object类的wait()、notify()和notifyAll()方法实现条件变量。
并发集合 并发集合是线程安全的集合类,包括ConcurrentHashMap、CopyOnWriteArrayList等。这些集合类提供了线程安全的操作,确保在多线程环境下不会出现数据不一致的问题。
CopyOnWrite容器 CopyOnWrite容器是一种线程安全的集合,每次修改操作都会创建一个新的副本,避免了线程间的竞争。在Java中,可以使用CopyOnWriteArrayList实现CopyOnWrite容器。
BlockingQueue BlockingQueue是一种线程安全的队列,支持生产者-消费者模型。常见的阻塞队列有LinkedBlockingQueue、ArrayBlockingQueue等。BlockingQueue提供了阻塞的put()和take()方法,使得生产者和消费者可以在队列达到指定条件时阻塞等待。
并发工具类 并发工具类包括Phaser、Exchanger、FutureTask等,用于简化并发编程。这些工具类提供了丰富的并发编程功能,如线程间的同步、数据交换、任务执行等。
非阻塞算法 非阻塞算法是指不使用锁或信号量等同步机制,通过其他方式保证线程安全。在Java中,可以使用CAS操作实现非阻塞算法。
CAS原理 CAS(Compare-And-Swap)是一种无锁算法,通过比较内存中的值和期望值,如果相等则将内存中的值替换为新值。在Java中,可以使用Atomic类实现CAS操作。
Atomic类 Atomic类是Java并发包中提供原子操作的类,包括AtomicInteger、AtomicLong等。这些类提供了原子性的读、写、比较和交换操作,确保在多线程环境下不会出现数据不一致的问题。
无锁队列 无锁队列是一种不使用锁的线程安全队列,通过CAS操作保证线程安全。在Java中,可以使用ConcurrentLinkedQueue实现无锁队列。
并发框架 并发框架包括Netty、Akka、Disruptor等,它们提供了高效的并发编程解决方案。这些框架提供了丰富的并发编程功能,如线程池管理、消息传递、事件驱动等。
Netty线程模型 Netty是一种高性能、可扩展的网络应用程序框架,其线程模型为NIO模型,可以处理高并发连接。Netty使用主从多线程模型,主线程负责处理连接的建立和销毁,从线程负责处理读写操作。
Akka Actor模型 Akka是一个基于Actor模型的并发框架,它将并发编程抽象为Actor之间的消息传递。Actor是一个轻量级的线程,可以并发地执行任务。Akka通过Actor系统实现了线程安全的数据共享和通信。
Disruptor环形缓冲区 Disruptor是一种高性能的并发队列,其核心数据结构为环形缓冲区,可以处理高并发数据。Disruptor通过环形缓冲区和发布-订阅模式实现了高效的并发数据传输。
二、MyBatis知识体系
SQL映射 MyBatis使用XML或注解的方式定义SQL映射,将Java对象与数据库表进行映射。在XML映射文件中,可以使用
1087

被折叠的 条评论
为什么被折叠?



