Java 的 java.util.concurrent(简称 JUC)包是 JDK 5 及以后引入的并发编程工具包,旨在解决传统线程模型(如 synchronizedwait/notify)的局限性,提供更灵活、高效、可扩展的并发编程组件。它极大简化了多线程开发,是 Java 并发编程的核心工具。

一、JUC 包的核心作用

传统并发编程依赖 synchronized 关键字和 Object 的 wait()/notify() 方法,存在灵活性低(锁无法中断、无法超时)、效率有限(重量级锁)等问题。JUC 包通过以下方式改进:

  • 提供更细粒度的同步控制(如可中断锁、超时锁);
  • 内置线程池管理,避免频繁创建销毁线程的开销;
  • 提供线程安全的并发集合(替代 HashMap 等线程不安全的集合);
  • 封装常用并发工具(如计数器、信号量),减少重复开发。

二、JUC 核心组件分类

JUC 包内容丰富,可分为以下几大模块:

1. 线程池框架(Executor 体系)

线程池是管理线程的容器,避免频繁创建 / 销毁线程的性能损耗,核心接口和类如下:

  • Executor:最顶层接口,定义了 execute(Runnable) 方法,用于执行任务。
  • ExecutorService:继承 Executor,增加了线程池生命周期管理(如 shutdown() 关闭线程池、submit() 提交带返回值的任务)。
  • ThreadPoolExecutor:线程池的核心实现类,需关注 7 个核心参数:
    • corePoolSize:核心线程数(始终存活的线程);
    • maximumPoolSize:最大线程数(核心线程 + 临时线程的上限);
    • keepAliveTime:临时线程空闲时的存活时间;
    • workQueue:任务等待队列(核心线程满时,新任务进入队列);
    • threadFactory:创建线程的工厂;
    • handler:任务拒绝策略(队列和最大线程都满时的处理方式)。
  • Executors:线程池工具类,提供便捷的线程池创建方法(如 newFixedThreadPool 固定大小线程池、newCachedThreadPool 缓存线程池),但实际开发中建议直接使用 ThreadPoolExecutor 自定义参数(避免资源耗尽风险)。
2. 并发集合(线程安全的容器)

传统集合(如 HashMapArrayList)线程不安全,JUC 提供了专门的并发集合,解决多线程读写安全问题:

并发集合类对应传统集合特点与适用场景
ConcurrentHashMapHashMap线程安全的哈希表,JDK 1.8 用 CAS + synchronized 实现(替代分段锁),支持高并发读写。
CopyOnWriteArrayListArrayList读写分离,写操作时复制底层数组,适合读多写少场景(如配置缓存)。
CopyOnWriteArraySetHashSet基于 CopyOnWriteArrayList 实现,原理同上。
ConcurrentLinkedQueueLinkedList(队列)无锁并发队列,基于 CAS 实现,适合高并发场景的队列操作。
BlockingQueue-阻塞队列,提供 put()(满时阻塞)和 take()(空时阻塞)方法,常用于生产者 - 消费者模型。实现类有 ArrayBlockingQueueLinkedBlockingQueue 等。
3. 同步工具类(控制线程协作)

用于协调多个线程的执行顺序或资源访问,核心工具包括:

  • Lock 与 Condition:替代 synchronized 和 wait()/notify() 的更灵活同步方式。

    • Lock 接口:定义 lock()(获取锁)、tryLock(long, TimeUnit)(超时获取锁)、unlock()(释放锁)等方法,实现类 ReentrantLock(可重入锁)是最常用的。
    • Condition:通过 Lock.newCondition() 创建,提供 await()(等待)、signal()(唤醒单个)、signalAll()(唤醒所有),可实现多个条件队列(比 Object 的单一等待队列更灵活)。
  • Semaphore(信号量):控制同时访问资源的线程数,类似 “许可证” 机制。例如:

    Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问
    semaphore.acquire(); // 获取许可证(若满则阻塞)
    // 访问资源...
    semaphore.release(); // 释放许可证
    
  • CountDownLatch(倒计时器):等待多个线程完成后再执行主线程。例如:

    CountDownLatch latch = new CountDownLatch(5); // 计数5
    // 子线程执行完后调用 latch.countDown();(计数-1)
    latch.await(); // 主线程阻塞,直到计数为0
    
  • CyclicBarrier(循环屏障):让多个线程到达 “屏障” 后等待,全部到达后一起继续执行(可重复使用)。例如:

    CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程就绪,开始执行"));
    // 每个线程执行到 barrier.await() 时等待,直到3个线程都到达
    
4. 原子类(Atomic 系列)

基于 CAS(Compare-And-Swap,比较并交换)操作,提供线程安全的原子性变量更新,避免使用 synchronized 的开销。核心类:

  • 基本类型:AtomicIntegerAtomicLongAtomicBoolean(提供 getAndIncrement() 原子自增等方法)。
  • 引用类型:AtomicReference(原子更新对象引用)、AtomicStampedReference(解决 CAS 的 ABA 问题,带版本号)。
  • 数组类型:AtomicIntegerArray(原子更新数组元素)。

示例:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增(替代 count++,线程安全)

5. 其他重要组件
  • Future 与 CallableCallable 是带返回值的任务(类似 Runnable 但有返回值),Future 用于获取 Callable 的执行结果。FutureTask 是 Future 的实现类,可包装 Callable 并作为任务提交给线程池。
  • AQS(AbstractQueuedSynchronizer):JUC 许多组件的底层基础(如 ReentrantLockSemaphore),通过维护一个 “同步状态” 和 “双向阻塞队列” 实现同步控制,核心是 acquire()(获取资源)和 release()(释放资源)。

三、JUC 的核心优势

  1. 更高的灵活性:如 Lock 支持超时、中断,Condition 支持多条件等待。
  2. 更好的性能:如 ConcurrentHashMap 比 Hashtable 效率更高,原子类基于 CAS 避免锁开销。
  3. 更丰富的功能:内置线程池、阻塞队列、信号量等工具,简化并发编程。

总结

JUC 包是 Java 并发编程的 “瑞士军刀”,涵盖了线程管理、同步控制、并发容器等核心能力。掌握 JUC 组件的原理和适用场景,能有效解决多线程开发中的安全性、性能和可维护性问题,是中高级 Java 开发者的必备知识。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode--44.通配符匹配

前言:不知不觉又断更一天了,其实昨天就把这道题写得差不多了,只是刚好在力扣里面看见了一种新的解法,本来想写出来的,但是我把它推到今天了,因为太晚了,但是今天又睡懒觉了,所以我直…

WHAT - 依赖管理工具 CocoaPods

文章目录1. 什么是 CocoaPods?2. 如何安装 CocoaPods?(1) 确保已安装 Ruby(macOS 默认自带)(2) 安装 CocoaPods(3) 验证安装3. 在 React Native 项目中使用 CocoaPods(1) 进入 iOS 目录(2) 初始化 Podfile(如果不存在&…

C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)

代码功能说明: 程序模式: 主动连接模式:当用户指定对端 IP 和端口时,尝试连接到对端被动监听模式:当用户未指定对端 IP 时,等待其他节点连接线程模型: 主线程:处理用户输入和消息发送接收线程:后台接收并显示对端消息关键组件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45猎人宝宝狼 技能恢复宏已知3.45BUG RL技能位会清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修复以前可用宏一键恢复状态-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

对于编写PID过程中的问题

当stm32RCT6使用位置环pid控制麦轮转动一定路程时&#xff0c;在这个时间段内想让一边轮胎速度加大应该怎么做&#xff1f;比如我pid的目标脉冲值为9000&#xff0c;在运行到3000的时候车偏左了&#xff0c;那我应该怎样让他回正&#xff0c;我想到的办法是增加其最大的脉冲值&…

LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记

LeetCode&#xff5c;Day13&#xff5c;88. 合并两个有序数组&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;88. 合并两个有序数组 难度&#xf…

【C++】初识C++(1)

个人主页&#xff1a;我要成为c嘎嘎大王 希望这篇小小文章可以让你有所收获&#xff01; 目录 前言 一、C的第一个程序 二、命名空间 2.1 namespace 的价值 2.2 namespace 的定义 2.2.1 正常的命名空间定义 2.2.2 命名空间可以嵌套 2.2.3 匿名命名空间 2.2.4 同名的name…

在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换

在新闻资讯 APP 中添加不同新闻分类页面&#xff0c;通过 ViewPager2 实现滑动切换 核心组件的作用 ViewPager2&#xff1a;是 ViewPager 的升级版&#xff0c;基于RecyclerView实现&#xff0c;支持水平 / 垂直滑动、RTL&#xff08;从右到左&#xff09;布局&#xff0c;且修…

vuex操作state为什么要使用mutations作为规范而不是直接修改state

1. 状态变更的可追踪性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕获每次 mutation 的执行记录&#xff0c;记录变更前后的 state 快照、参数和调用栈。直接修改 state&#xff1a;Devtools 无法检测到变更来源&#xff0c;导致调试困难&#xff08;如无…

Spring AI 系列之九 - RAG-入门

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

【数据结构】基于顺序表的通讯录实现

目录 1 顺序表的概念及结构 1.1 线性表 1.2 顺序表分类 1.2.1 静态顺序表 1.2.2 动态顺序表 2 顺序表的实现 2.1 顺序表的初始化 2.2 顺序表中数据的增加和修改 2.2.1 顺序表的头插 2.2.2 顺序表的尾插 2.2.3 顺序表的头删 2.2.4 顺序表的尾删 2.2.5 顺序表指定位置…

C语言与汇编混合编程

一、GCC 扩展语法与MSVC约束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;内联汇编语法 asm("汇编指令");#或者 __asm__("汇编指令");#使用更复杂的语法来指定输入、输出操作数和修改的寄存器&#xff1a; asm volatile…

WPF中的ListBox详解

文章目录简介ListBoxItem选中项目动态列表简介 【ListBox】是列表控件&#xff0c;其内部可包含多个【ListBoxItem】&#xff0c;用户可以从列表中选择一个或多个项&#xff0c;若Item个数超过指定高度&#xff0c;则右侧会自动出现滚动条&#xff0c;非常便捷。尽管逻辑上来说…

【历史人物】【李白】生平事迹

目录 一、李白个人简历 二、个人主要经历 三、个人成就及影响 1、诗 2、词 3、书法 4、剑术 5、理想 四、历史评价 五、趣事 1、李白搁笔 2、赠汪伦 一、李白个人简历 基本信息‌ 姓名&#xff1a;李白&#xff0c;字太白&#xff0c;号青莲居士 性别&#xff1…

HALCON+PCL混合编程

HALCON与PCL的混合编程基础 HALCON和PCL(Point Cloud Library)都是处理3D数据的强大工具&#xff0c;但它们有着不同的设计目标和数据结构。HALCON专注于机器视觉应用&#xff0c;提供了丰富的图像处理和分析功能&#xff1b;而PCL则是专门为点云处理设计的开源库。 要实现两者…

JavaScript书写基础和基本数据类型

JavaScript书写基础和基本数据类型 jarringslee js书写基础和规范 js是一种在客户端&#xff08;浏览器&#xff09;运行的编程语言&#xff0c;可实现人机交互的效果。js组成&#xff1a; js由两部分组成&#xff1a; ECMAScript&#xff1a;js的语言基础&#xff0c;js遵循其…

CSS个人笔记分享【仅供学习交流】

1、调整透明度 .text{ background-color: rgba(0, 0, 0, 0.08); }解释&#xff1a;rgba&#xff08;rgb三元素&#xff0c;透明度取值从0~1&#xff09; 2、文字和图片对齐方式 长用于头像旁边的昵称居中显示<img src"img/hua" alt"">华仔</img&g…

24.找到列表中最大或最小值的索引

找到列表中最大或最小值的索引 在 Python 中,如果你想找出某个列表中最小或最大值的位置(索引),你可以通过两步快速实现: 使用 min() 或 max() 获取目标值使用 .index() 获取目标值在列表中的索引位置✅ 基础实现 def min_element_index(arr):return arr.index(min(arr)

如何解决pip安装报错ModuleNotFoundError: No module named ‘pandas’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘pandas’问题 摘要 在使用 PyCharm 的 Python 控制台或终端执行 pip install pandas 后&#xff0c;仍然出现 ModuleNotFoundError: No module named ‘pandas…

【env环境】rtthread5.1.0使用fal组件

配置 board/Kconfigconfig BSP_USING_ON_CHIP_FLASHbool "Enable On Chip Flash"default ncp rt-thread/components/fal/samples/porting/fal_cfg.h board/fal_cfg.h /** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.…