Java JUC(java.util.concurrent)是Java并发编程的核心工具包,提供了丰富的并发工具类和框架。以下是JUC的主要知识点,按难易程度分类,供你参考:


1. 基础概念与工具类

1.1 并发与并行(易)
  • 内容:理解并发(Concurrency)和并行(Parallelism)的区别。

  • 重要性:基础概念,理解并发编程的前提。

1.2 线程与线程池(中)
  • 内容:线程的创建与启动(ThreadRunnable)。线程池(ExecutorServiceThreadPoolExecutor)。线程池参数(核心线程数、最大线程数、队列类型、拒绝策略)。

  • 重要性:线程池是并发编程的核心工具,必须掌握。

1.3 线程生命周期与状态(易)
  • 内容:线程的6种状态(NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED)。

  • 重要性:理解线程状态是调试并发问题的基础。


2. 同步与锁

2.1 synchronized关键字(易)
  • 内容:方法同步与代码块同步。锁的粒度与性能优化。

  • 重要性:最基础的同步机制。

2.2 ReentrantLock(中)
  • 内容:可重入锁的基本使用。公平锁与非公平锁。tryLocklockInterruptibly等高级特性。

  • 重要性:比synchronized更灵活的锁机制。

2.3 ReadWriteLock(中)
  • 内容:读写锁(ReentrantReadWriteLock)。读锁与写锁的分离。

  • 重要性:适用于读多写少的场景。

2.4 StampedLock(难)
  • 内容:乐观读锁与悲观读锁。锁的升级与降级。

  • 重要性:高性能锁,适用于特定场景。


3. 原子操作类

3.1 AtomicIntegerAtomicLong等(易)
  • 内容:原子操作的基本使用。compareAndSet(CAS)原理。

  • 重要性:无锁编程的基础。

3.2 AtomicReferenceAtomicStampedReference(中)
  • 内容:引用类型的原子操作。解决ABA问题。

  • 重要性:适用于复杂对象的原子操作。

3.3 LongAdderDoubleAdder(中)
  • 内容:高并发场景下的累加器。分段锁机制。

  • 重要性:比AtomicLong性能更高。


4. 并发集合

4.1 ConcurrentHashMap(中)
  • 内容:分段锁与CAS机制。高并发下的性能优化。

  • 重要性:最常用的并发集合。

4.2 CopyOnWriteArrayListCopyOnWriteArraySet(易)
  • 内容:写时复制机制。适用场景与性能特点。

  • 重要性:适用于读多写少的场景。

4.3 BlockingQueue及其实现类(中)
  • 内容ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueueputtake等阻塞操作。

  • 重要性:生产者-消费者模型的实现基础。

4.4 ConcurrentLinkedQueueConcurrentSkipListMap(难)
  • 内容:无锁队列与跳表。高并发场景下的性能优势。

  • 重要性:适用于高性能无锁场景。


5. 同步工具类

5.1 CountDownLatch(易)
  • 内容:等待多个线程完成任务。

  • 重要性:多线程协作的基础工具。

5.2 CyclicBarrier(中)
  • 内容:多线程到达屏障后继续执行。与CountDownLatch的区别。

  • 重要性:适用于分阶段任务。

5.3 Semaphore(中)
  • 内容:控制并发线程数。信号量的基本使用。

  • 重要性:资源池管理的核心工具。

5.4 Phaser(难)
  • 内容:多阶段任务同步。动态调整参与线程数。

  • 重要性:适用于复杂任务调度。

5.5 Exchanger(难)
  • 内容:线程间数据交换。

  • 重要性:适用于特定场景。


6. 异步编程

6.1 FutureFutureTask(中)
  • 内容:异步任务的结果获取。get方法的阻塞特性。

  • 重要性:异步编程的基础。

6.2 CompletableFuture(难)
  • 内容:链式调用与组合操作。thenApplythenAcceptthenCombine等方法。

  • 重要性:现代异步编程的核心工具。


7. 线程调度与定时任务

7.1 ScheduledExecutorService(中)
  • 内容:定时任务与周期性任务。

  • 重要性:替代Timer的推荐工具。

7.2 ForkJoinPool(难)
  • 内容:分治算法与工作窃取。RecursiveTaskRecursiveAction

  • 重要性:适用于计算密集型任务。


8. 其他高级特性

8.1 ThreadLocal(中)
  • 内容:线程本地变量。内存泄漏问题。

  • 重要性:线程间数据隔离的工具。

8.2 AQS(AbstractQueuedSynchronizer)(难)
  • 内容:同步器的底层实现。自定义锁与同步工具。

  • 重要性:理解JUC底层机制的关键。

8.3 内存模型与volatile(中)
  • 内容:可见性、有序性、原子性。happens-before原则。

  • 重要性:理解并发编程的基础。


学习建议

  1. 从易到难:先掌握基础概念和工具类,再深入学习高级特性。

  2. 动手实践:通过编写代码加深理解,尤其是并发集合和同步工具类。

  3. 阅读源码:特别是AQSConcurrentHashMap等核心类的源码。

  4. 调试与测试:使用工具(如JConsole、VisualVM)分析并发问题。


通过系统学习以上知识点,你将全面掌握Java JUC的核心内容,并能够应对实际开发中的并发编程挑战。

详细演示上面功能


Java JUC 知识点完整汇总


1. 基础概念与工具类

1.1 并发与并行

描述

  • 并发:多个任务交替执行,适用于单核 CPU 或多线程任务。

  • 并行:多个任务同时执行,需要多核 CPU 支持。

  • 适用范围:理解并发与并行的区别是并发编程的基础。

  • 注意点:并行需要硬件支持(多核 CPU)。

  • 实现原理:并发通过线程切换实现,并行通过多核 CPU 实现。

代码示例

public class ConcurrencyVsParallelism {public static void main(String[] args) {// 并发:多个任务交替执行Runnable task = () -> System.out.println(Thread.currentThread().getName() + " is running");new Thread(task).start(); // 启动线程1new Thread(task).start(); // 启动线程2// 并行:多个任务同时执行(需要多核CPU支持)ExecutorService executor = Executors.newFixedThreadPool(2); // 创建固定大小的线程池executor.submit(task); // 提交任务1executor.submit(task); // 提交任务2executor.shutdown(); // 关闭线程池}
}
1.2 线程与线程池

描述

  • 线程:Java 中最基本的并发单元。

  • 线程池:管理线程的生命周期,避免频繁创建和销毁线程。

  • 适用范围:需要频繁创建线程的场景。

  • 注意点:线程池参数(核心线程数、最大线程数、队列类型、拒绝策略)需要合理配置。

  • 实现原理:线程池通过任务队列和工作线程实现任务调度。

代码示例

public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2); // 创建固定大小的线程池executor.submit(() -> System.out.println("Task 1")); // 提交任务1executor.submit(() -> System.out.println("Task 2")); // 提交任务2executor.shutdown(); // 关闭线程池}
}
1.3 线程生命周期与状态

描述

  • 线程状态NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED

  • 适用范围:调试和分析线程行为。

  • 注意点:线程状态是 JVM 管理的,开发者无法直接控制。

  • 实现原理:JVM 通过内部状态机管理线程状态。

代码示例

public class ThreadStateExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {try {Thread.sleep(1000); // TIMED_WAITING} catch (InterruptedException e) {e.printStackTrace();}});System.out.println(thread.getState()); // NEWthread.start();System.out.println(thread.getState()); // RUNNABLEthread.join();System.out.println(thread.getState()); // TERMINATED}
}

2. 同步与锁

2.1 synchronized

描述

  • 适用范围:简单的线程同步场景。

  • 注意点:锁的粒度要尽量小,避免性能问题。

  • 实现原理:基于 JVM 内置锁机制,通过 monitorenter 和 monitorexit 指令实现。

代码示例

public class SynchronizedExample {private static class Counter {private int count = 0;public synchronized void increment() {count++; // 临界区操作}public int getCount() {return count;}}public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment(); // 调用同步方法}};Thread thread1 = new Thread(task); // 创建线程1Thread thread2 = new Thread(task); // 创建线程2thread1.start(); // 启动线程1thread2.start(); // 启动线程2thread1.join(); // 等待线程1完成thread2.join(); // 等待线程2完成System.out.println("Final count: " + counter.getCount()); // 输出最终结果}
}
2.2 ReentrantLock

描述

  • 适用范围:需要更灵活的锁控制(如可中断锁、超时锁)。

  • 注意点:必须手动释放锁,否则会导致死锁。

  • 实现原理:基于 AQS(AbstractQueuedSynchronizer)实现。

代码示例

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private static class Counter {private int count = 0;private final ReentrantLock lock = new ReentrantLock(); // 创建 ReentrantLockpublic void increment() {lock.lock(); // 获取锁try {count++; // 临界区操作} finally {lock.unlock(); // 释放锁}}public int getCount() {return count;}}public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment(); // 调用同步方法}};Thread thread1 = new Thread(task); // 创建线程1Thread thread2 = new Thread(task); // 创建线程2thread1.start(); // 启动线程1thread2.start(); // 启动线程2thread1.join(); // 等待线程1完成thread2.join(); // 等待线程2完成System.out.println("Final count: " + counter.getCount()); // 输出最终结果}
}

3. 原子操作类

3.1 AtomicInteger

描述

  • 适用范围:无锁的线程安全计数器。

  • 注意点:适用于简单的原子操作,复杂场景可能需要锁。

  • 实现原理:基于 CAS(Compare-And-Swap)实现。

代码示例

import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerExample {public static void main(String[] args) {AtomicInteger atomicInt = new AtomicInteger(0); // 初始化值为 0atomicInt.incrementAndGet(); // 原子操作:自增并返回新值atomicInt.addAndGet(5); // 原子操作:增加指定值并返回新值System.out.println("Final value: " + atomicInt.get()); // 输出最终值}
}

4. 并发集合

4.1 ConcurrentHashMap

描述

  • 适用范围:高并发场景下的键值对存储。

  • 注意点:不支持 null 键和值。

  • 实现原理:分段锁 + CAS 机制。

代码示例

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); // 创建 ConcurrentHashMapmap.put("a", 1); // 插入键值对map.put("b", 2); // 插入键值对System.out.println("Value for key 'a': " + map.get("a")); // 获取值}
}

5. 同步工具类

5.1 CountDownLatch

描述

  • 适用范围:等待多个线程完成任务。

  • 注意点:计数器不能重置。

  • 实现原理:基于 AQS 实现。

代码示例

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(2); // 初始化计数器为 2new Thread(() -> {System.out.println("Task 1 completed");latch.countDown(); // 计数器减 1}).start();new Thread(() -> {System.out.println("Task 2 completed");latch.countDown(); // 计数器减 1}).start();latch.await(); // 阻塞直到计数器为 0System.out.println("All tasks completed");}
}

6. 异步编程

6.1 Future

描述

  • 适用范围:异步任务的结果获取。

  • 注意点get() 方法会阻塞,直到任务完成。

  • 实现原理:基于 Runnable 和 Callable 实现。

代码示例

import java.util.concurrent.*;public class FutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建单线程线程池Future<Integer> future = executor.submit(() -> 1 + 1); // 提交任务System.out.println("Task result: " + future.get()); // 获取任务结果executor.shutdown(); // 关闭线程池}
}

7. 线程调度与定时任务

7.1 ScheduledExecutorService

描述

  • 适用范围:定时任务和周期性任务。

  • 注意点:任务执行时间过长会影响后续任务。

  • 实现原理:基于线程池和任务队列。

代码示例

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledExecutorServiceExample {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 创建调度线程池scheduler.schedule(() -> System.out.println("Task executed"), 1, TimeUnit.SECONDS); // 延迟执行scheduler.shutdown(); // 关闭线程池}
}

8. 其他高级特性

8.1 ThreadLocal

描述

  • 适用范围:线程间数据隔离。

  • 注意点:可能导致内存泄漏,需要及时清理。

  • 实现原理:每个线程维护一个独立的 ThreadLocalMap

代码示例

public class ThreadLocalExample {private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Initial Value");public static void main(String[] args) {new Thread(() -> {threadLocal.set("Thread 1 Value"); // 设置线程本地变量System.out.println("Thread 1: " + threadLocal.get()); // 获取线程本地变量}).start();new Thread(() -> {threadLocal.set("Thread 2 Value"); // 设置线程本地变量System.out.println("Thread 2: " + threadLocal.get()); // 获取线程本地变量}).start();}
}


以上是 Java JUC 的完整知识点汇总,包含代码示例、实现原理和注意点。如果需要进一步补充或调整,请随时告诉我!

文章转载自:佛祖让我来巡山

原文链接:JUC相关知识点总结 - 佛祖让我来巡山 - 博客园

体验地址:JNPF快速开发平台

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

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

相关文章

激光频率梳 3D 测量方案革新:攻克光学扫描遮挡,130mm 深孔测量精度达 2um

一、深孔测量的光学遮挡难题在精密制造领域&#xff0c;130mm 级深孔&#xff08;如航空发动机燃油孔、模具冷却孔&#xff09;的 3D 测量长期受困于光学遮挡。传统激光扫描技术依赖直射光束&#xff0c;当深径比超过 10:1 时&#xff0c;孔壁中下部形成大量扫描盲区&#xff0…

clickhouse 中文数据的正则匹配

中文数据的正则匹配 在ClickHouse中,正则匹配通常用于数据的筛选、格式化等操作。以下是一些常用的正则匹配技巧: 1. 匹配中文字符 要匹配中文字符,可以使用以下正则表达式: SELECT * FROM my_table WHERE my_column REGEXP [\\x{4e00}-\\x{9fa5}];这里的 \\x{4e00}-\\…

[驱动开发篇] Can通信进阶 --- CanFD 的三次采样

驱动开发篇] Can通信进阶 --- Can报文的三次采样一、CAN FD的采样次数1.1. 标准规定1.2. 传统标准CAN采样1.3. CAN FD的采样策略1.3.1. 基础采样策略1.4. 配置位置1.5. 常见步骤二、CAN FD与标准CAN在采样机制上的主要区别三、使用建议四. 芯片厂商实现4.1. 实际市面情况4.2. 例…

分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡

分布式中间件弹性扩容与rebalance冲平衡176_如果宕机的数据节点事后再次重启会发生什么事情&#xff1f;某个之前某个宕机的数据节点DataNode-A又重启后&#xff0c;肯定会再次注册&#xff0c;并进行全量上报的流程&#xff0c;此时&#xff0c;就会导致DataNode-A上的文件副本…

芯祥科技:工业/车规级BMS芯片厂商 规格选型对比

芯祥科技公司专注于工业和车规级BMS芯片&#xff0c;电源芯片及可编程模拟芯片的研发与销售&#xff0c;客户遍及新能源储能&#xff0c;汽车&#xff0c;电脑&#xff0c;服务器及电动工具等领域。并具有创业公司成功经验&#xff0c;平均具有逾17年以上的芯片研发和市场销售经…

莫队基础(Mo‘s algorithm)

莫队算法简介 莫队算法是一种用于高效处理离线区间查询问题的算法&#xff0c;由莫涛&#xff08;Mo Tao&#xff09;在2009年提出。其核心思想是通过对查询区间进行分块和排序&#xff0c;利用前一次查询的结果来减少计算量&#xff0c;从而将时间复杂度优化至接近线性。 莫…

板卡两个ADC,一个JESD204b sync正常,另一个JESD204B同步不上的问题

目录 1.问题来源: 2.问题分析 进一步测试表现: 抓取204B高速链路数据如上所示。 说明不是配置流程的问题 1.问题来源: 在工控机上和部分电脑上面出现时钟锁不住的现象,无法正常使用板卡。 经过分析,发现板卡上有两片ADC,其中一片的ADC的sync信号经过测量,是正常的,…

Android10 系统休眠调试相关

Android10 系统休眠调试相关实时打印休眠日志(实测好像没作用)&#xff1a;echo 1 > /sys/module/printk/parameters/console_suspend查看唤醒锁&#xff1a;cat sys/power/wake_lock msm8953_64:/ # cat sys/power/wake_lock PowerManager.SuspendLockout PowerManagerServ…

一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)

文章目录一、Bard机器翻译概述1.1. Bard机器翻译介绍1.2 Bard机器翻译的核心特点1.3 技术背景1.4 与同类模型对比二、Bard机器翻译案例2.1 官方 REST API&#xff08;推荐生产&#xff09;2.2 通过Google Cloud API调用2.3 私有化部署方案2.4 开源镜像 PyBard&#xff08;无需 …

Kafka-Eagle 安装

Kafka-Eagle官网 1&#xff09;上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群第一台的/opt/modules 目录 2&#xff09;解压到本地 tar -zxvf kafka-eagle-bin-2.0.8.tar.gz 3&#xff09;将 efak-web-2.0.8-bin.tar.gz 解压至/opt/installs cd kafka-eagle-bin-2.0.8 …

接口请求的后台发起确认

场景讲解做业务开发时经常遇到这些场景&#xff0c;在后端代码执行命中了些业务规则&#xff0c;需要前端用户确认一下再往下执行。示例1&#xff1a;后端判断申请1笔超过5万的资金时会发起监管流程&#xff0c;告诉前端操作用户风险并询问是否确认执行。示例2&#xff1a;数据…

完整学习MySQL

DML 等术语概念 DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;&#xff1a; DML主要用于插入、更新、删除和查询数据库中的数据。常见的DML语句包括&#xff1a; INSERT&#xff1a;用于向表中插入新的数据行。UPDATE&#xff1a;用于修改…

大模型笔记1——李宏毅《2025机器学习》第一讲

本篇笔记内容1、学习本节课需要的前置知识了解大模型的训练过程&#xff1a;预训练、后训练、强化学习&#xff08;2024年生成式AI导论前8讲&#xff09;了解基础机器学习、深度学习概念&#xff08;如transformer&#xff09;&#xff08;2021年机器学习课程&#xff09;2、本…

CSS scrollbar-width:轻松定制滚动条宽度的隐藏属性

在前端设计中&#xff0c;滚动条往往是一个容易被忽略的细节。默认的滚动条样式常常与页面设计格格不入&#xff0c;尤其是宽度 —— 过宽的滚动条会挤占内容空间&#xff0c;过窄又可能影响用户操作。而 CSS 的scrollbar-width属性&#xff0c;就像一把 “精细的尺子”&#x…

小迪23年-28~31-js简单回顾

前端-js开发 课堂完结后欲复习巩固也方便后续-重游-故写此篇 从实现功能过渡到涉及的相关知识点 知识点 1、 JS 是前端语言&#xff0c;是可以被浏览器“看到”的&#xff0c;当然也可以被修改啊&#xff0c;被浏览器禁用网页的 JS 功能啊之类的。所以一般都是前后端分离开发&…

JavaScript 概述

JavaScript 是一种高级、解释型编程语言&#xff0c;主要用于网页开发&#xff0c;使其具备动态交互功能。它是网页三大核心技术之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能够直接嵌入 HTML 页面并在浏览器中执行。核心特性动态弱类型语言 JavaScript 是…

Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现

什么是Mermaid?系统架构设计 三层架构 overview架构交互流程 核心组件详解 1. Spring Boot后端2. Node.js中间层3. 前端界面 功能实现 1. 节点和关系管理2. 流程图渲染3. 主题切换4. 导出功能 使用指南 启动步骤页面操作 总结与展望 什么是Mermaid? Mermaid流程图可视化系统…

R 数据框:高效数据处理与分析的利器

R 数据框:高效数据处理与分析的利器 引言 在数据科学和统计分析领域,R语言因其强大的数据处理能力和丰富的统计模型而备受推崇。R数据框(data frame)是R语言中一种重要的数据结构,它以表格形式存储数据,使得数据的组织、操作和分析变得简单高效。本文将深入探讨R数据框…

论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》

论文阅读笔记&#xff1a;《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》1.背景与动机2.核心贡献3.方法详解4.实验结果与贡献主体代码算法整体逻辑CVPR25 github 一句话总结&#xff1a; CCFS基于组合范式&#xff08;轨迹匹配选择真实图像&…

【Linux系统】详解,进程控制

前言&#xff1a; 上文我们讲到了Linux中的虚拟空间地址&#xff0c;知道了一个进程对应一个虚拟地址空间&#xff0c;虚拟空间地址与物理地址之间通过页表映射....【Linux】虚拟地址空间-CSDN博客 本文我们来讲一讲Linux系统是如何控制进程的&#xff01; 如果喜欢本期文章&am…