JUC高并发编程详解

news2025/1/23 17:43:15

大家好,欢迎来到这篇关于JUC(Java Util Concurrent)高并发编程的博客!在这个数字时代,我们的软件需求越来越庞大,而对于高并发编程的需求也日益迫切。在Java的世界里,JUC就像一位强大的武士,为我们打开了处理并发编程的大门。今天,我们将深入了解JUC,学习它的各种武器和战术,助你在并发的战场上游刃有余。

在这里插入图片描述

为什么要关注高并发?

在我们的日常生活中,我们经常面对着需要同时处理多个任务的情况。比如,你在一个热门的电商网站购物,同时成千上万的人也在浏览同一件商品;或者你在一个社交平台发布了一条动态,瞬间就被数百人点赞和评论。这时,高并发就成了我们需要面对的挑战。所以,掌握高并发编程是我们作为程序员必备的技能之一。

JUC简介

首先,让我们认识一下JUC。JUC是Java 5引入的一个包,旨在提供更强大的并发编程支持。可以把它想象成一座丰富多彩的工具库,里面有各种各样的工具,帮助我们轻松应对并发的各种问题。

并发基础知识

在深入JUC之前,我们需要掌握一些基础的并发概念。首先是线程,你可以把它想象成程序中的一条执行路径。当多个线程同时执行时,就会涉及到共享资源的访问问题。这时,我们就需要考虑如何保证多个线程之间的安全性。

同步与异步

在并发编程中,同步和异步是两个关键的概念。同步指的是按照程序的顺序依次执行,而异步则是可以同时执行多个任务,不需要等待前一个任务完成。就像你在餐馆等待上菜的时候,服务员会继续为其他桌的客人服务,这就是异步。

// 示例:同步执行
public synchronized void synchronizedMethod() {
    // 一些同步操作
}

// 示例:异步执行
public void asynchronousMethod() {
    CompletableFuture.runAsync(() -> {
        // 一些异步操作
    });
}

互斥锁

在并发编程中,互斥锁是一种常用的同步机制,用于保护共享资源,防止多个线程同时修改数据造成的问题。在Java中,我们可以使用synchronized关键字或ReentrantLock类来实现互斥锁。

// 示例:synchronized关键字
public synchronized void synchronizedMethod() {
    // 互斥锁保护的操作
}

// 示例:ReentrantLock
private final ReentrantLock lock = new ReentrantLock();

public void lockMethod() {
    lock.lock();
    try {
        // 互斥锁保护的操作
    } finally {
        lock.unlock();
    }
}

JUC的利器:线程池

在高并发环境下,创建大量线程会导致系统资源的浪费和性能下降。为了更有效地管理线程,JUC提供了线程池的概念。

线程池的好处

线程池通过维护一定数量的线程,重复利用它们来执行任务,避免了频繁创建和销毁线程的开销。这不仅提高了程序的性能,还避免了线程数量失控可能带来的问题。

使用线程池

JUC提供了Executor框架,用于管理线程池。下面是一个简单的线程池的创建和使用示例:

// 示例:创建固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);

// 提交任务
executorService.submit(() -> {
    // 执行任务的代码
});

// 关闭线程池
executorService.shutdown();

原子操作与CAS

在高并发环境中,对共享变量的操作可能会导致数据不一致的问题。为了解决这个问题,JUC提供了原子操作和CAS(Compare and Swap)机制。

原子变量

在JUC中,Atomic开头的类如AtomicIntegerAtomicLong等提供了一系列原子操作,保证了多个线程对变量的操作是原子的。

// 示例:AtomicInteger的使用
AtomicInteger atomicInteger = new AtomicInteger(0);

int result = atomicInteger.incrementAndGet();

CAS机制

CAS是一种乐观锁的实现方式,通过比较并交换的方式来保证操作的原子性。在JUC中,Atomic类的原子操作就是基于CAS实现的。

// 示例:CAS的使用
AtomicInteger atomicInteger = new AtomicInteger(0);

while (true) {
    int current = atomicInteger.get();
    int next = current + 1;

    if (atomicInteger.compareAndSet(current, next)) {
        // 成功修改,退出循环
        break;
    }
}

并发工具类

JUC还提供了一些强大的并发工具类,帮助开发者更方便地处理高并发场景。

CountDownLatch

CountDownLatch是一种同步工具,允许一个或多个线程等待其他线程完成操作。

// 示例:CountDownLatch的使用
CountDownLatch countDownLatch = new CountDownLatch(3);

// 线程1
new Thread(() -> {
    // 一些操作
    countDownLatch.countDown();
}).start();

// 线程2
new Thread(() -> {
    // 一些操作
    countDownLatch.countDown();
}).start();

// 线程3
new Thread(() -> {
    // 一些操作
    countDownLatch.countDown();
}).start();

// 主线程等待
countDownLatch.await();

CyclicBarrier

CyclicBarrier也是一种同步工具,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点。

// 示例:CyclicBarrier的使用
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

// 线程1
new Thread(() -> {
    // 一些操作
    try {
        cyclicBarrier.await(); // 等待其他线程
    } catch (InterruptedException | BrokenBarrierException e) {
        e.printStackTrace();
    }
}).start();

// 线程2
new Thread(() -> {
    // 一些操作
    try {
        cyclicBarrier.await(); // 等待其他线程
    } catch (InterruptedException | BrokenBarrierException e) {
        e.printStackTrace();
    }
}).start();

// 线程3
new Thread(() -> {
    // 一些操作
    try {
        cyclicBarrier.await(); // 等待其他线程
    } catch (InterruptedException | BrokenBarrierException e) {
        e.printStackTrace();
    }
}).start();

// 主线程等待
cyclicBarrier.await();

Semaphore

Semaphore是一种允许多个线程同时访问共享资源的同步工具。

// 示例:Semaphore的使用
Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问

// 线程1
new Thread(() -> {
    try {
        semaphore.acquire(); // 获取许可
        // 一些操作
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release(); // 释放许可
    }
}).start();

// 线程2、线程3 略...

线程安全容器

在多线程环境中,对容器的操作需要考虑线程安全性。JUC提供了一些线程安全的容器,如ConcurrentHashMapCopyOnWriteArrayList等。

ConcurrentHashMap

ConcurrentHashMapHashMap的线程安全版本,适用于高并发的场景。

// 示例:ConcurrentHashMap的使用
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

map.put("key1", 1);
map.put("key2", 2);

int result = map.get("key1");

CopyOnWriteArrayList

CopyOnWriteArrayListArrayList的线程安全版本,它通过在写操作时复制整个容器,避免了写操作影响读操作的性能问题。

// 示例:CopyOnWriteArrayList的使用
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

list.add("element1");
list.add("element2");

String result = list.get(0);

异步编程

随着异步编程的兴起,JUC也提供了一些支持异步编程的工具。

CompletableFuture

CompletableFuture是一个强大的工具,用于异步编程。它支持链式调用,可以方便地处理异步任务的结果。

// 示例:CompletableFuture的使用
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行的任务
    return "Hello";
}).thenApplyAsync(result -> {
    // 在上一个任务的结果上进行操作
    return result + " World";
}).thenAcceptAsync(finalResult -> {
    // 处理最终结果
    System.out.println(finalResult);
});

// 主线程等待
future.join();

总结

JUC提供了丰富的工具和框架,帮助开发者更轻松地应对高并发编程的挑战。从线程池、原子操作、并发工具类到线程安全容器和异步编程,每个组件都为我们提供了强大的功能。通过深入理解并合理使用这些工具,我们能够编写出高效、安全且易维护的高并发程序。

高并发编程可能是一项复杂的任务,但通过学习和实践,我们可以逐步掌握其中的要点。希望这篇博客对你在JUC高并发编程的学习和实践中有所帮助。在这个充满挑战的编程领域中,让我们携手前行,不断探索并发的奥秘! Happy coding!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

线程池-2:runWorker分析-1

为何runWorker中在task被当前worker中的当前线程获取到准备执行task时需要进行worker.lock()? 如下图&#xff1a; 1、某个worker中的run逻辑只会被worker中包装的线程进行执行&#xff1b; 2、按理说&#xff1a;不会存在多个线程并发执行同一个worker中的runWorker()逻辑&a…

蓝桥杯真题Day41 倒计时13天 纯练题,该开始复习知识点了!

蓝桥杯第十二届省赛真题-分果果 题目描述 小蓝要在自己的生日宴会上将 n 包糖果分给 m 个小朋友。每包糖果都要分出去&#xff0c;每个小朋友至少要分一包&#xff0c;也可以分多包。 小蓝将糖果从 1 到 n 编号&#xff0c;第 i 包糖果重 wi。小朋友从 1 到 m 编号。每个小朋…

Codeforces Round 838 (Div. 2) D. GCD Queries

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

SpringCloud下的微服务应用技术(结尾篇)

六. Feign远程调用 6.1 替代RestTemplate RestTemplate调用问题&#xff1a;代码可读性差&#xff0c;参数复杂且URL难维护。 Feign是一个声明式的HTTP客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign: Feign makes writing java http clients easier 它可…

安装DPDK环境

安装DPDK环境 下载解压源码 wget https://fast.dpdk.org/rel/dpdk-19.08.2.tar.xz tar -xcf ./dpdk-19.08.2.tar.xz安装源码 1.处理库文件 编译库文件 ./dpdk-setup.sh 根据操作系统选择对应gcc库文件2.设置环境变量 配置多网卡队列和巨页 ethernet1.virtualDev "vm…

车载以太网AVB交换机 TSN交换机 时间敏感网络 11口 千兆 SW2000TSN

目录 一、TSN时间敏感交换机概述 二、产品介绍 SW2000M/H TSN 1、产品框架 2、产品特点与参数 产品特点 产品参数 3、配置与使用 4、常用连接方式 4.1 双通道作为监控和数据采集器&#xff0c;采集两个设备间的通信数据&#xff08;Bypass功能&#xff09; 4.2 试验搭…

如何用Python脚本自动发送邮件?

目录 1. 基础知识 1.1. SSH&#xff08;Secure Shell&#xff09;协议 1.2. SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;协议 1.3. SSH协议与SMTP协议之间的关系 2. QQ邮箱设置 2.1. 开启SMTP服务 2.2. 编写脚本 3. 测试成功 1. 基础知识 邮件的发送过…

XXE漏洞知识及ctfshow例题

XXE漏洞相关知识 XXE全称为XML Enternal Entity Injection 中文叫xml外部实体注入 什么是xml 简单了解XML&#xff1a; &#xff08;xml和html的区别可以简易的理解成&#xff1a;xml是用来储存数据和传输数据的而html是用来将数据展现出来&#xff09; XML 指可扩展标记语…

UE中:200W个对象单场景实现(待更新)

实现背景&#xff1a;需要显示城市级的行人以及地理市级范围内的路灯的状态&#xff0c;行人需要有状态以及位置的更新&#xff0c;路灯只需要状态的更新&#xff0c;二者都不需要物理 方案1概述&#xff1a;Niagara粒子系统实现 实际效果展示 UE5 集群模拟&#xff08;20W&a…

pmp培训机构哪个比较好?国内10大热门PMP培训机构是哪些?

热门PMP培训机构推荐&#xff0c;PMP备考选择威班就是选择了高通过率 PMP热门培训机构方面我还是比较推荐威班的&#xff0c;当时选择的时候有人推荐我&#xff0c;也了解了很多&#xff0c;各种科普各种对比选择&#xff0c;最后还是选择了威班。经过体验他们的通过率比较靠谱…

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop,新建或打开工程

离线linux服务器安装mysql8

本文的服务器环境&#xff1a;openEuler毛坯版的&#xff0c;很多常用的指令都没有预装&#xff0c;比如rpm、tar等等&#xff0c;没有网络坏境&#xff0c;需要自己手动配置本地yum仓库&#xff0c;安装相关指令 1、检查服务器是否已经安装了MySQL 1.1、查询mysql以安装的相关…

imx6ull移植rtthread操作系统

内存映射移植 1.进入&#xff1a;E:\rtthread\rt-smart-20201125\rt-smart\kernel\bsp\imx6ull 2.打开menuconfig&#xff0c;修改PV_OFFSET 1.进入&#xff1a;E:\rtthread\rt-smart-20201125\rt-smart\kernel\bsp\imx6ull\drivers 2.进入board.c&#xff0c;修改即…

番外篇——Idea安装通义灵码插件

最近公司领导心血来潮要求我们这些编外开发人员也要做到与时俱进。听了这话同事们纷纷起哄道&#xff1a;“什么叫与时俱进&#xff1f;怎么个做法呢&#xff1f;”领导洋洋得意地说道&#xff1a;“现在市场啥最火&#xff1f;不就是大模型嘛&#xff01;你们都在自己的开发工…

springboot共享单车系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享单车管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了共享单车管理系统&#xff0c;它彻底改变了过…

项目管理—项目合同签订后客户又不认了

大家好&#xff0c;我是不会魔法的兔子&#xff0c;是一名执业律师&#xff0c;创建[项目管理者的法小院儿]&#xff0c;持续从法律的角度分享项目管理中的风险及预防问题&#xff0c;让项目管理者能够提早发现与解决项目执行过程中的风险&#xff0c;同时欢迎大家一起交流&…

FreeRTOS day1

1.总结keil5下载代码和编译代码需要注意的事项 需要与板子连通 配置完成后才点击下载 2.总结STM32Cubemx的使用方法和需要注意的事项 下载支持包 打开芯片配置界面 3.总结STM32Cubemx配置GPIO的方法

【笔记】通过码云Gitee获取OpenHarmony源码

Note&#xff1a;下面包含操作过程和问题解决&#xff08;首次安装Ubuntu&#xff0c;环境未完善&#xff09;&#xff0c;没有遇到问题可以直接跳过问题part了&#xff0c;小白也能完成配置下载。 前置准备&#xff08;Git环境账号&#xff09; &#xff08;一&#xff09;安…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…