Java中的并发工具类:让多线程编程更轻松

Java中的并发工具类:让多线程编程更轻松

1. 引言:多线程编程的“痛”

多线程编程是Java开发中的一大难点,尤其是在高并发场景下,稍有不慎就会遇到线程安全问题、死锁、性能瓶颈等问题。比如:

public class Counter {private int count = 0;public void increment() {count++; // 非线程安全!}public int getCount() {return count;}
}

在多线程环境下,count++操作可能会导致数据不一致。为了解决这些问题,Java提供了丰富的并发工具类,让我们能够更轻松地编写高效、安全的多线程代码。


2. Java并发工具类简介

Java的java.util.concurrent包提供了许多强大的并发工具类,主要包括:

  • 原子类:如AtomicIntegerAtomicReference
  • :如ReentrantLockReadWriteLock
  • 同步工具:如CountDownLatchCyclicBarrierSemaphore
  • 线程池:如ThreadPoolExecutorScheduledThreadPoolExecutor

3. 常用并发工具类实战

3.1 原子类(Atomic Classes)

原子类通过CAS(Compare-And-Swap)操作保证线程安全,适用于简单的计数器、标志位等场景。

import java.util.concurrent.atomic.AtomicInteger;public class Counter {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.incrementAndGet(); // 线程安全!}public int getCount() {return count.get();}
}
3.2 可重入锁(ReentrantLock)

ReentrantLock提供了比synchronized更灵活的锁机制,支持公平锁、可中断锁等特性。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Counter {private int count = 0;private Lock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public int getCount() {return count;}
}
3.3 倒计时门闩(CountDownLatch)

CountDownLatch用于等待多个线程完成任务后再继续执行。

import java.util.concurrent.CountDownLatch;public class Main {public static void main(String[] args) throws InterruptedException {int threadCount = 5;CountDownLatch latch = new CountDownLatch(threadCount);for (int i = 0; i < threadCount; i++) {new Thread(() -> {System.out.println("线程完成任务");latch.countDown();}).start();}latch.await(); // 等待所有线程完成任务System.out.println("所有线程完成任务,继续执行主线程");}
}
3.4 信号量(Semaphore)

Semaphore用于控制同时访问某个资源的线程数量。

import java.util.concurrent.Semaphore;public class Main {public static void main(String[] args) {int permits = 3;Semaphore semaphore = new Semaphore(permits);for (int i = 0; i < 10; i++) {new Thread(() -> {try {semaphore.acquire();System.out.println("线程获取许可,开始执行任务");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();System.out.println("线程释放许可");}}).start();}}
}

4. 并发工具类的最佳实践

4.1 避免过度同步

同步操作会降低性能,尽量减少同步代码块的范围。

4.2 使用线程池

避免频繁创建和销毁线程,使用线程池管理线程资源。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {executor.submit(() -> {System.out.println("线程执行任务");});}executor.shutdown();}
}
4.3 避免死锁

确保锁的获取顺序一致,避免嵌套锁。

4.4 使用并发集合

Java提供了许多线程安全的集合类,如ConcurrentHashMapCopyOnWriteArrayList

import java.util.concurrent.ConcurrentHashMap;public class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("key", 1);System.out.println(map.get("key"));}
}

5. 实战案例:多线程下载器

5.1 需求描述

我们需要实现一个多线程下载器,将一个大文件分成多个部分,由多个线程同时下载。

5.2 实现代码
import java.util.concurrent.CountDownLatch;public class MultiThreadDownloader {private static final int THREAD_COUNT = 5;public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(THREAD_COUNT);for (int i = 0; i < THREAD_COUNT; i++) {new Thread(() -> {System.out.println("线程开始下载文件部分");try {Thread.sleep(1000); // 模拟下载过程} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程完成下载文件部分");latch.countDown();}).start();}latch.await();System.out.println("所有线程完成下载,开始合并文件");}
}

6. 总结

Java中的并发工具类为我们提供了强大的多线程编程支持,让我们能够更轻松地应对高并发场景。通过掌握这些工具类的使用方法和最佳实践,我们可以编写出高效、安全的多线程代码。


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

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

相关文章

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下&#xff1a; TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因&#xff0c;排查还得去看源码&#xff0c;所以我们来解决&a…

idea上git log面板的使用

文章目录 各种颜色含义具体的文件的颜色标签颜色&#x1f3f7;️ 节点和路线 各种颜色含义 具体的文件的颜色 红色&#xff1a;表示还没有 git add 提交到暂存区绿色&#xff1a;表示已经 git add 过&#xff0c;但是从来没有 commit 过蓝色&#xff1a;表示文件有过改动 标…

一分钟学习数据安全——数据安全的核心概念CIA以及安当解决方案

数据安全三要素是指保密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integrity&#xff09;和可用性&#xff08;Availability&#xff09;&#xff0c;它们是信息安全领域的核心概念&#xff0c;旨在确保信息的安全和可信度。这边文章用一分钟的时间&#…

Electron 开发者的 Tauri 2.0 实战指南:文件系统操作

作为 Electron 开发者&#xff0c;我们习惯了使用 Node.js 的 fs 模块来处理文件操作。在 Tauri 2.0 中&#xff0c;文件系统操作被重新设计&#xff0c;采用了 Rust 的安全特性和权限系统。本文将帮助你理解和重构这部分功能。 文件操作对比 Electron 的文件操作 在 Electr…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

事件监听,事件类型

点击按钮实现 盒子关闭 随机点名案例 先给开始按钮添加点击事件 获取显示名字的 div 和 开始按钮的 div给开始按钮添加点击事件&#xff0c;设置定时器&#xff0c;每隔35ms内获取一个数组长度内的随机数&#xff0c;将显示名字的 div内的内容替换为该随机数作为下标的数组的内…

基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗行业正经历着深刻的变革,对智能化、高效化的需求日益迫切。传统的医疗模式在面对海量的医疗数据、复杂的诊断流程以及个性化的治疗需求时,逐渐显露出局限性。随着人工智能技术的飞速发展,多模态大模型作为一种前沿技术…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

深度解析Linux中关于操作系统的知识点

操作系统概述与核心概念 任何计算机系统都包含一个基本的程序集合&#xff0c;成为操作系统OS 操作系统是一款进行软硬件管理的软件 操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;驱动管理&#xff09; 其他程序&#xff08;例如数据…

LLM在事实性和时效性方面问题解决办法

LLM在事实性和时效性方面问题解决办法 以及进行可靠评估的一些方法 一、解决事实性问题的技术方法 知识图谱融合与增强 方法:将知识图谱与LLM集成,在模型生成内容时,实时查询知识图谱以确保信息的准确性。例如,当LLM生成关于历史事件的描述时,它可以查询历史知识图谱,获…

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 &#xff0c;是三格电子推出的工业级网关&#xff08;以下简 称网关&#xff09;&#xff0c;主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集&#xff0c; IEC103 支持遥测和遥 信&#xff0c;可接…

202312 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)

第 1 题 统计指定范围里的数 给定一个数的序列S,以及一个区间[L,R],求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,表示序列的长度。(0<n≤10000) 第二行n个正整数,表示序列里的每…

通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我

通过将模型权重矩阵表示为低秩矩阵&#xff0c;可以减少需要调整的参数数量&#xff0c;原因在于低秩矩阵的结构本身就比高秩矩阵更“紧凑”&#xff0c;即它们需要的独立参数更少。具体来说&#xff0c;低秩矩阵的结构可以通过减少模型的自由度&#xff08;独立参数的数量&…

C++ 数据结构:基本概念、时间复杂度、空间复杂度

数据结构&#xff1a;是指数据的存储以及存储方式&#xff0c;决定了数据的物理结构和逻辑结构&#xff0c;良好的数据结构可以提高程序的存储、查询、修改效率&#xff0c;降低复杂度和错误率。 算法&#xff1a;解决问题的步骤和方法&#xff0c;一个好的算法应具有高效、简…

如何监控和防范小红书笔记详情API的安全风险?

流量监控与异常检测 请求频率监测&#xff1a; 建立一个系统来记录 API 的请求频率。可以通过在服务器端设置计数器或者使用专业的监控工具来实现。例如&#xff0c;对于每个 API 调用者&#xff08;可以通过 API 密钥或者用户标识来区分&#xff09;&#xff0c;记录它们在单…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…

【计算机网络】深入浅出计算机网络

第一章 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成一种重要的信息服务基础设施 CNNIC 中国互联网网络信息中心 因特网概述 网络、互联网和因特网 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路…

【linux】vi编辑文件及readonly文件修改读写权限方法

板端vi修改文件&#xff1a; 1、vi 文件路径 vi mnt/eol/config/oem_eol.xml2、按 i进入修改状态&#xff0c;此时可以修改配置文件 3、按 esc退出修改状态&#xff0c;并按:wq!保存 问题&#xff1a;readonly文件无法直接vi修改 方案&#xff1a; 1、mount -o remount /rw…

Vue.js组件开发-使用地图绘制轨迹

在Vue.js中开发一个组件来展示地图并绘制轨迹&#xff0c;可以使用诸如Leaflet.js、Mapbox GL JS或百度地图等地图库。这些库提供了丰富的API来创建和定制地图&#xff0c;以及绘制路径、标记和其他地图元素。 示例&#xff1a; 1. 安装Leaflet.js 首先&#xff0c;需要安装…