JUC 03

news2025/7/12 9:57:48

今天是2025/03/28 20:46 day 14

总路线请移步主页Java大纲相关文章

今天进行JUC 6,7,8 个模块的归纳

首先是JUC的相关内容概括的思维导图

由于内容比较多且重要

个人还整理了一份详细JUC的思维导图,需要的请评论。是 xmind文件

6. 锁机制

深入解析 锁机制是JUC中处理线程同步的核心模块,其核心在于提供更精细的线程控制能力,同时兼顾性能优化。

核心组件扩展
  1. ReentrantLock

    • 公平锁 vs 非公平锁

      • 公平锁:严格按照线程请求顺序分配锁(通过new ReentrantLock(true)启用),但可能因频繁上下文切换降低吞吐量。

      • 非公平锁:允许线程“插队”获取锁(默认模式),减少线程切换开销,但可能导致线程饥饿。

    • 可重入性:同一线程可多次获取锁(锁计数器+1),必须等计数器归零后其他线程才能竞争。

    • 锁中断:支持lockInterruptibly(),允许线程在等待锁时响应中断。

  2. ReentrantReadWriteLock

    • 锁降级:写线程持有写锁时,可获取读锁后释放写锁,保证数据可见性。

    • 锁升级限制:不允许读锁直接升级为写锁(可能导致死锁)。

  3. StampedLock

    • 乐观读:通过tryOptimisticRead()获取“票据”(无锁),随后通过validate(stamp)验证数据是否被修改。

    • 锁转换:支持将读锁转换为写锁(tryConvertToWriteLock()),需处理可能的失败。

    • 缺点:不支持可重入,且复杂的API容易引发错误。

  4. Condition

    • 精准唤醒:通过多个Condition对象(如condition1condition2)实现不同条件的等待与唤醒。

    • 典型应用:生产者-消费者模型(不同条件队列管理生产者和消费者)。

底层原理
  • AQS(AbstractQueuedSynchronizer):锁机制的基石,通过CLH队列管理线程排队,利用state变量表示锁状态。

  • CAS(Compare and Swap):通过原子操作(如Unsafe类)实现锁状态的修改,避免传统互斥锁的性能问题。

使用场景与示例
  • 高竞争写场景:使用ReentrantLock的非公平模式提升吞吐量。

  • 读多写少场景:优先选择ReentrantReadWriteLockStampedLock的乐观读。

  • 复杂协作:使用Condition实现线程间条件等待。

生产者-消费者示例

ReentrantLock lock = new ReentrantLock();  
Condition notFull = lock.newCondition();  
Condition notEmpty = lock.newCondition();  
Queue<Integer> queue = new LinkedList<>();  
int capacity = 10;  
​
// 生产者  
lock.lock();  
try {  
    while (queue.size() == capacity) {  
        notFull.await(); // 等待队列不满  
    }  
    queue.add(data);  
    notEmpty.signal(); // 唤醒消费者  
} finally {  
    lock.unlock();  
}  
​
// 消费者  
lock.lock();  
try {  
    while (queue.isEmpty()) {  
        notEmpty.await(); // 等待队列不空  
    }  
    data = queue.poll();  
    notFull.signal(); // 唤醒生产者  
} finally {  
    lock.unlock();  
}  
注意事项
  • 死锁预防:避免嵌套锁请求,使用tryLock()设置超时。

  • 性能监控:通过JVM工具(如JConsole)监控锁竞争情况。


7. 工具类

深入解析 工具类通过封装复杂的线程协作逻辑,提供轻量级同步原语,适用于多种并发场景。

核心组件扩展
  1. CountDownLatch

    • 一次性屏障:计数器归零后无法重置,适合“主线程等待子线程初始化完成”的场景。

    • 典型应用:微服务启动时等待所有依赖服务就绪。

  2. CyclicBarrier

    • 可重用性:通过reset()重置计数器,适合分阶段任务(如多轮数据清洗)。

    • 回调功能:构造时可传入Runnable任务,所有线程到达屏障后触发。

  3. Semaphore

    • 公平性控制:构造函数支持公平模式(new Semaphore(permits, true))。

    • 动态调整许可:通过release()acquire()动态增减信号量。

  4. Phaser

    • 动态注册/注销:支持register()arriveAndDeregister()动态调整参与线程数。

    • 分层阶段:支持多阶段任务(如onAdvance()方法定义阶段结束条件)。

  5. Exchanger

    • 数据交换:两个线程通过exchange()方法交换数据,适用于“流水线”处理模型。

底层原理
  • 共享同步状态:多数工具类基于AQS实现(如CountDownLatch使用AQS的共享模式)。

  • 条件队列管理:如CyclicBarrier通过ReentrantLockCondition实现线程等待。

使用场景与示例
  • 批量任务并行执行

    CyclicBarrier barrier = new CyclicBarrier(5, () -> System.out.println("All tasks ready!"));  
    // 5个线程调用 barrier.await()  
  • 限流保护

    Semaphore semaphore = new Semaphore(100); // 限制并发数为100  
    semaphore.acquire();  
    try { /* 访问资源 */ } finally { semaphore.release(); }  
注意事项
  • 避免线程泄漏:确保CountDownLatch的计数器最终归零。

  • Phaser的灵活性:适合动态调整任务阶段的场景,但需谨慎处理阶段超时。


8. 高级主题

深入解析 高级主题聚焦于性能优化和复杂并发模型,需结合底层机制和实际场景综合运用。

核心内容扩展
  1. 原子类进阶

    • LongAdder:通过分段累加(Cell数组)减少CAS竞争,适用于高并发计数场景。

    • AtomicStampedReference:通过版本号解决ABA问题(如无锁栈的实现)。

  2. 并发集合优化

    • ConcurrentHashMap

      • 分段锁(Java 7):将数据分为16个Segment,降低锁粒度。

      • CAS + synchronized(Java 8+):对单个Node加锁,进一步提升并发度。

    • CopyOnWriteArrayList:每次写操作复制新数组,适合读多写极少场景(如监听器列表)。

  3. Fork/Join框架

    • 工作窃取算法:空闲线程从其他线程的任务队列尾部“窃取”任务,减少竞争。

    • 递归任务拆分:通过RecursiveTaskRecursiveAction实现分治逻辑。

    • 示例(计算1~n的和)

      class SumTask extends RecursiveTask<Long> {  
          protected Long compute() {  
              if (任务足够小) return 直接计算;  
              else {  
                  SumTask left = new SumTask(...);  
                  SumTask right = new SumTask(...);  
                  left.fork();  
                  return right.compute() + left.join();  
              }  
          }  
      }  
  4. CompletableFuture

    • 链式调用:通过thenApply(), thenCompose(), thenCombine()组合异步任务。

    • 异常处理:通过exceptionally()handle()捕获异常。

    • 超时控制:Java 9+支持orTimeout()completeOnTimeout()

  5. 线程池调优

    • 核心参数

      • 核心线程数:CPU密集型任务建议设置为CPU核数,IO密集型可适当增大。

      • 队列选择SynchronousQueue(直接传递任务)、LinkedBlockingQueue(无界队列,可能OOM)。

    • 监控指标:活跃线程数、队列堆积、任务拒绝次数(通过ThreadPoolExecutor钩子方法)。

使用场景与示例
  • 高并发计数器

    LongAdder adder = new LongAdder();  
    adder.increment(); // 线程安全  
  • 异步服务调用链

    CompletableFuture<User> future = CompletableFuture  
        .supplyAsync(() -> getUserById(id), executor)  
        .thenApplyAsync(user -> enrichUser(user), executor)  
        .exceptionally(ex -> fallbackUser());  
注意事项
  • 无锁编程的陷阱:CAS可能导致“忙等待”,需结合退避策略(如指数退避)。

  • 线程池资源隔离:不同业务使用独立线程池,避免相互影响。


总结 JUC的高级模块要求开发者深入理解底层机制(如AQS、CAS)并结合实际场景灵活选择工具。锁机制提供精细化控制,工具类简化线程协作,高级主题则通过原子类、Fork/Join等实现高效并发模型。在实际应用中,需结合性能监控工具(如Arthas、JProfiler)持续优化,平衡性能与复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7 部署RuoYi 项目

换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源&#xff0c;以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

【JavaScript】八、对象

文章目录 1、对象的声明2、对象的使用3、对象中的方法4、遍历对象5、内置对象Math 1、对象的声明 一种数据类型&#xff0c;使用typeof查看类型&#xff0c;结果是object可以详细的描述描述某个事物 声明语法&#xff1a; // 多用花括号形式声明 // 比如声明一个person对象 …

Processor System Reset IP 核 v5.0(vivado)

这个IP的作用&#xff0c;我的理解是&#xff0c;比普通按键复位更加高效灵活&#xff0c;可以配置多个复位输出&#xff0c;可以配置复位周期。 1、输入信号&#xff1a; 重要的信号有时钟clk信号&#xff0c;一般连接到系统时钟&#xff1b;输入复位信号&#xff0c;一般是外…

linux0.11内核源码修仙传第十一章——硬盘初始化

&#x1f680; 前言 本文是初始化最后一部分了&#xff0c;对硬盘的初始化&#xff0c;对应于书中的第20回。希望各位给个三连&#xff0c;拜托啦&#xff0c;这对我真的很重要&#xff01;&#xff01;&#xff01; 目录 &#x1f680; 前言&#x1f3c6;块设备管理&#x1f3…

包络解调在故障诊断中的应用-广义检波解调案例

前言 前面我们曾介绍过广义检波解调的原理&#xff0c;那么今天就将学过的知识点真正用在故障诊断上&#xff0c;由于工厂数据集不能轻易获取&#xff0c;因此通过实验室仿真数据集来介绍整个诊断流程。 数据集 加拿大渥太华是故障诊断领域蛮出名的一个数据集&#xff0c;其…

喜报|迪捷软件入选工信部“2024年信息技术应用创新解决方案”

为进一步深化行业信息技术应用创新&#xff0c;健全信息技术应用创新产业生态&#xff0c;加快新技术新产品应用推广&#xff0c;强化应用牵引和需求导向&#xff0c;加强区域联动和资源整合&#xff0c;工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心…

2.Python 计算机二级题库:选择题答案解析

一 对 题目1 题目2 题目3 补充&#xff1a;在 Python 中&#xff0c;数字类型的复数类型是 complex。 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目11 题目12 题目13 题目14 题目15 题目16 题目17 题目18 题目19 题目20 题目21 题目22 题目23 题目24 题目25 题目26 题目27…

使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

一、地址&#xff1a; url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数&#xff0c;请帮忙修改一下~ 二、用到的知识点以及代码详解&#xff1a; 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…

大模型训练过程中KVCache与MLA

基础内容 在Transformer模型中&#xff0c;每个token有qkv三个属性&#xff0c;分别通过神经网络变换得到。1 根据Transformer中注意力公式&#xff0c;每个token的q需要和之前所有的k计算注意力&#xff0c;然后经过Softmax函数后乘以之前所有token的V&#xff0c;得到最终的…

材质及制作笔记

基本流程&#xff1a; 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图&#xff1a; diffuse/albedo/basecolor&#xff1a;漫反射 reflection/specular&#xff1a;反射 metalness&#xff1a;金属度 glossiness&#xf…

语音机器人与智能体结合

自从春节期间deepseek的发布&#xff0c;大家对语音机器人接入大模型格外的关注。最近又收到一个需求&#xff0c;是语音机器人与智能体的结合。 什么是智能体&#xff1f; 智能体&#xff08;Agent&#xff09;是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…

Axios企业级封装实战:从拦截器到安全策略!!!

&#x1f680; Axios企业级封装实战&#xff1a;从拦截器到安全策略 &#x1f527; 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // &#x1f310; 全局API前缀timeout: 0, // ⏳ 永不超时&#xff08;慎用&#xff01;&#xff09;withCrede…

Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步

一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统&#xff0c;执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…

51c嵌入式~三极管~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12208603 一、PNP与NPN两种三极管使用方法 分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。 在单片机应用电路中三极管主要的作用就是开关作用。 PNP与NPN两种三极管使用方法 上图中&#xff0c;横向左…

SQL中累计求和与滑动求和函数sum() over()的用法

[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 sum()&#xff1a…

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言认识雪花ID…

FPGA——分秒计数器设计(DE2-115开发板)

一、项目创建 1.创建工程 点击File->New Project Wizard...或者直接在页面处点击 在第一行选择文件存放地点&#xff0c;第二行为项目名称&#xff0c;第三行为顶级设计实体名称 &#xff08;下面的步骤可以暂时不做直接点Finish&#xff0c;因为是先写代码先把它跑出来暂…

雅思练习总结(九)

雅思练习总结&#xff08;九&#xff09; 本文章是雅思练习总结&#xff08;九&#xff09;&#xff0c;总结了文章《BAKELITE》&#xff0c;内容包括原文精翻&#xff0c;文章脉络总结&#xff0c;单词扩展学习3个部分 1 文章原文及翻译 BAKELITE 翻译&#xff1a;贝克莱特…

windows USB 了解

GUID GUID 是一个 128 位的数字&#xff0c;在全球范围内是独一无二的&#xff0c;常被用于标识软件组件、设备接口等&#xff0c;以保证在不同系统和环境中能唯一识别特定对象。 DEFINE_GUID(GUID_DEVINTERFACE_USCUSTOMKEYS, 0x12345678, 0x1234, 0x5678, 0x12, 0x12, 0x23…

光谱相机的光谱信息获取

光谱信息的获取方式主要依赖于不同分光技术和成像方法&#xff0c;将入射光分解为不同波长并记录其强度。以下是常见的光谱信息获取技术分类及原理&#xff1a; ‌1. 分光技术&#xff08;物理分解波长&#xff09;‌ ‌(1) 滤光片法‌ ‌原理‌&#xff1a;使用固定或可调滤…