Java学习手册:Java并发编程最佳实践
在Java并发编程中,遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践,帮助开发者避免常见陷阱并编写高效的并发程序。
1. 选择合适的并发工具
Java提供了丰富的并发工具,选择合适的工具可以简化开发并提高性能。
- 使用并发容器:在多线程环境下,优先使用
ConcurrentHashMap
、CopyOnWriteArrayList
等并发容器,而不是对传统容器进行手动同步。 - 使用原子类:对于简单的数值操作,如计数器,使用
AtomicInteger
、AtomicLong
等原子类可以避免锁的开销。 - 使用线程池:通过
ExecutorService
管理线程,而不是手动创建和销毁线程,以减少资源消耗。
2. 避免过度同步
过度同步会降低程序性能并增加复杂性。尽量减少同步代码块的范围,只对必要的代码进行同步。
public class BetterBankAccount {private double balance;private final Object lock = new Object();public void deposit(double amount) {if (amount > 0) {synchronized (lock) {balance += amount;}}}public void withdraw(double amount) {if (amount > 0) {synchronized (lock) {if (amount <= balance) {balance -= amount;}}}}
}
3. 使用不可变对象
不可变对象天生线程安全,通过将对象的状态设置为final
并确保其不可修改,可以避免许多线程安全问题。
public final class ImmutableObject {private final int value;public ImmutableObject(int value) {this.value = value;}public int getValue() {return value;}
}
4. 使用局部变量和线程本地变量
局部变量和线程本地变量(ThreadLocal
)可以避免线程之间的数据共享,从而减少锁的使用。
public class ThreadLocalExample {private static final ThreadLocal<Integer> localValue = new ThreadLocal<>();public static void main(String[] args) {localValue.set(42);System.out.println(localValue.get());}
}
5. 使用volatile
确保可见性
对于简单的布尔标志或状态变量,使用volatile
关键字可以确保变量的修改对所有线程立即可见。
public class VisibilityExample {private volatile boolean flag = false;public void setFlag(boolean flag) {this.flag = flag;}public boolean getFlag() {return flag;}
}
6. 避免死锁
死锁是并发编程中的常见问题,以下是一些避免死锁的建议:
- 按顺序获取锁:如果多个线程需要获取多个锁,确保它们按相同的顺序获取锁。
- 使用定时锁:在尝试获取锁时使用定时方法,如
tryLock()
,以避免无限期等待。 - 减少锁的持有时间:尽快释放锁,避免长时间持有。
7. 使用CompletableFuture
进行异步编程
CompletableFuture
提供了强大的异步编程能力,可以简化复杂的异步操作。
import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Hello, CompletableFuture!";}).thenAccept(System.out::println);}
}
8. 使用Fork/Join
框架处理大规模数据
Fork/Join
框架适用于处理大规模数据的分治算法,可以显著提高处理效率。
import java.util.concurrent.RecursiveTask;public class ForkJoinExample extends RecursiveTask<Integer> {private final int[] array;private final int start;private final int end;public ForkJoinExample(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}@Overrideprotected Integer compute() {if (end - start <= 1000) {int sum = 0;for (int i = start; i < end; i++) {sum += array[i];}return sum;} else {int mid = (start + end) / 2;ForkJoinExample left = new ForkJoinExample(array, start, mid);ForkJoinExample right = new ForkJoinExample(array, mid, end);left.fork();right.fork();return left.join() + right.join();}}
}
9. 使用StampedLock
处理读写操作
StampedLock
提供了比ReentrantReadWriteLock
更灵活的读写锁机制,适用于读多写少的场景。
import java.util.concurrent.locks.StampedLock;public class StampedLockExample {private double x, y;private final StampedLock lock = new StampedLock();public void move(double deltaX, double deltaY) {long stamp = lock.writeLock();try {x += deltaX;y += deltaY;} finally {lock.unlockWrite(stamp);}}public double distanceFromOrigin() {long stamp = lock.tryOptimisticRead();double currentX = x;double currentY = y;if (!lock.validate(stamp)) {stamp = lock.readLock();try {currentX = x;currentY = y;} finally {lock.unlockRead(stamp);}}return Math.sqrt(currentX * currentX + currentY * currentY);}
}
10. 性能监控与调优
定期监控并发程序的性能,识别瓶颈并进行调优。
- 使用性能监控工具:如
VisualVM
、JProfiler
等工具监控线程状态、CPU使用率和内存占用。 - 分析线程 dump:通过线程 dump 分析线程状态,识别死锁、线程饥饿等问题。
- 调整线程池参数:根据实际负载调整线程池的大小和其他参数。
总结
Java并发编程需要综合考虑线程安全、性能和可维护性。通过遵循上述最佳实践,开发者可以编写出高效、可靠的并发程序。希望本文提供的建议和示例能帮助读者在实际开发中更好地应用Java并发编程技术。
相关文章:
Java学习手册:Java并发编程最佳实践
在Java并发编程中,遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践,帮助开发者避免常见陷阱并编写高效的并发程序。 1. 选择合适的并发工具 Java提供了丰富的并发工具,选择合适的工具可以简…...
接口自动化测试(二)
一、接口测试流程:接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情:理解需求,学会看接口文档 只需要找到我…...
C++类和对象上
1. 面向对象编程与面向过程编程的比较 我们一开始接触的C语言就是一门面向过程编程的语言,而C就是一门面向对象编程的语言。那么这两者有什么区别呢? 举个例子,就比如说点外卖,如果是C语言的话,那么在程序的编写过程…...
hadoop的三大结构及各自的作用
Hadoop 分布式文件系统(HDFS) 存储大量数据:HDFS 被设计用于在商品硬件上存储海量数据,它将大文件分割成多个数据块,并分布存储在集群中的不同节点上,支持数据的可靠存储和高效访问。提供数据冗余和容错机制…...
珈和科技遥感赋能农业保险创新 入选省级卫星应用示范标杆
为促进空天信息与数字经济深度融合,拓展卫星数据应用场景价值,提升卫星数据应用效能和用户体验,加速卫星遥感技术向民生领域转化应用,近日,湖北省国防科工办组织开展了2024年湖北省卫星应用示范项目遴选工作。 经多渠…...
香港服务器CPU对比:Intel E3与E5系列核心区别与使用场景
香港服务器的 CPU 配置(核心数与主频)直接决定了其并发处理能力和数据运算效率,例如高频多核处理器可显著提升多线程任务响应速度。在实际业务场景中,不同负载需求对 CPU 架构的要求存在显著差异——以 Intel E3 和 E5 系列为例,由于两者在性…...
【人工智能】DeepSeek 与 RAG 技术:构建知识增强型问答系统的实战
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 本文深入探讨了如何利用 DeepSeek R1 模型结合检索增强生成(RAG)技术,构建一个高效的知识增强型问答系统。RAG 技术通过结合信息检索与生…...
得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程
在全球制造业加速向数字化、智能化转型的浪潮中,胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合,正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…...
超导体的应用价值:超导磁探测技术开启科技与生活的新变革
科技的飞速发展,带来了一种新型材料的快速应用,那就是超导体材料。超导体的特性,能够为当今社会众多领域带来革命性的变革,也将极大的改变我们现在的生活质量。 超导体的特性 超导体是指在特定温度下的电阻会突然消失,…...
UNION和UNION ALL的主要区别
UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下: 1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,而UNION ALL不会…...
软件项目验收报告模板
软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块(包含RFID识别、库存预警)出库调度模…...
第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块
一、JOIN:跨表查询的核心机制 1. JOIN 类型总览 JOIN 是连接多个表获取综合信息的关键手段。常见 JOIN 类型如下: INNER JOIN(内连接):仅返回两个表中满足连接条件的行。LEFT OUTER JOIN(左连接…...
中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?
在Mysql数据存储或性能瓶颈时,采用冷热数据分离的方式通常是一种选择。ClickHouse和Elasticsearch(ES)是两个常用的组件,但具体使用哪种组件取决于冷数据的存储目的、查询模式和业务需求等方面。 1、核心对比 (1&…...
JESD204B标准及其在高速AD采集系统中的应用详解
一、JESD204B协议的本质与核心价值 JESD204B是由JEDEC制定的第三代高速串行接口标准(2011年发布),专为解决高速ADC/DAC与FPGA/ASIC间数据传输瓶颈而设计。其核心突破体现在: 速率革命性提升 支持每通道最高12.5Gbps(通…...
给予FLUX更好的控制:FLUX.1-dev-ControlNet-Union-Pro-2.0
Shakker Labs FLUX.1-dev-ControlNet-Union-Pro-2.0 一、模型概述 Shakker Labs发布的FLUX.1-dev-ControlNet-Union-Pro-2.0是一个统一的ControlNet模型,专为FLUX.1-dev模型设计。该模型在前一版本基础上进行了多项改进,包括移除模式嵌入以减小模型尺寸…...
Hadoop的三大结构及其作用?
Hadoop是一个分布式存储和计算框架,其三大核心组件是HDFS(Hadoop Distributed File System)、YARN(Yet Another Resource Negotiator)和MapReduce。它们各自有着重要的作用,共同构成了Hadoop生态系统的基础…...
langgraph框架之初识
1.什么是langgraph? LangGraph 是一个用于构建可控代理的底层编排框架。在AI中,代理也就是执行动作的智能体,也就是agent。使用这个框架可以构建一个可以自由控制的智能执行体,它可以帮我们做许多事情,如下࿱…...
3个实用的脚本
1. Linux 系统清理临时文件脚本 该脚本用于清理系统中 /tmp 目录下超过 7 天的临时文件。 #!/bin/bash# 清理 /tmp 目录下超过 7 天的文件 find /tmp -type f -atime 7 -exec rm -f {} \;# 清理 /var/tmp 目录下超过 7 天的文件 find /var/tmp -type f -atime 7 -exec rm -f {…...
Vue3 Composition API与十大组件开发案例详解
文章目录 一、Vue3核心API解析1.1 Composition API优势1.2 核心API 二、十大组件开发案例案例1:响应式表单组件案例2:动态模态框(Teleport应用)案例3:可复用列表组件案例4:全局状态通知组件案例5࿱…...
万用表判断MOS好坏
无论什么封装,D极一般在正面看的上面,或者焊盘面积最大的一面: 【零】烧个洞的那种,不用量了,一眼损坏 【一】万用表的二极管档位测量 检修:使用万用表的二极管档位,S极接红表笔,黑…...
算法驱动光场革命:SLM技术引领智能光学新时代
◀背景引入▶ 空间光调制器本质上是一种能够对光波的振幅、相位或偏振状态进行空间分布调制的动态光学器件,我司自主研发的SLM产品采用硅基液晶技术,通过电信号控制液晶分子的排列状态,实现对入射光波的精确调控。这种精确调控能力使得SLM成…...
webgl入门实例-11WebGL 视图矩阵 (View Matrix)基本概念
WebGL 视图矩阵 (View Matrix) 在WebGL中,视图矩阵(View Matrix)定义了观察者(相机)在世界空间中的位置和方向,它实现了从世界坐标系到相机坐标系的转换。 什么是视图矩阵? 视图矩阵是一个4x4的矩阵,用于: 将场景从…...
ESP32 搭建IDF+Vscode环境(详细教程)
1. IDF环境安装 1.1 ESP-IDF介绍 ESP-IDF (Espressif IoT Development Framework) 是 Espressif( 乐鑫) 公司提供的面向ESP32 系列 的官方开源开发框架,用于开发物联网应用。ESP-IDF 的特点是高度的集成性和可移植性,提供了完整的 SDK,…...
精准计量+AI管控——安科瑞助力高校水电管理数字化转型
安科瑞顾强 传统管理痛点:效率低、隐患多、成本高 高校后勤水电管理长期面临多重挑战:人工抄表需宿管逐层逐户记录,耗时耗力且易出现漏抄、错抄,导致费用核算不公;老旧机械式电表误差率高达5%-10%,计量纠…...
PHP腾讯云人脸核身获取SIGN Ticket
参考腾讯云官方文档:人脸核身 获取 SIGN ticket_腾讯云 前提条件:已经获取了access_token。获取方法可参考: PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getSignTicket(){$access_token file_get_contents(/data/confi…...
探索 Higress:下一代云原生 API 网关
引言 在云原生时代,API 网关作为连接客户端与后端服务的桥梁,扮演着至关重要的角色。Higress 是一款由阿里巴巴开发的先进云原生 API 网关,基于开源的 Istio 和 Envoy 构建。它通过将流量网关、微服务网关和安全网关三者高度集成,…...
UE5编辑器静止状态下(非 Play 模式)睫毛和眼睛的渲染是正常的,而在 Play 模式下出现模糊
这通常指向以下几个 运行时(Runtime) 特有的原因: 抗锯齿 (Anti-Aliasing) 方法,特别是 Temporal Anti-Aliasing (TAA): 这是最可能的原因。 UE5 默认启用的 TAA 通过混合多帧信息来平滑边缘和减少闪烁,尤其是在运动中…...
ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)
1. 环境 虚拟机镜像ISO:ubuntu-24.04.2-live-server-arm64.iso 2. 定制cloud-init镜像 2.1 安装OS 基于ubuntu-24.04.2-live-server-arm64.iso,通过virt-manager安装操作系统,语言建议选择英文,分区选择基于LVM的自动分区&…...
解决 Spring Boot 多数据源环境下事务管理器冲突问题(非Neo4j请求标记了 @Transactional 尝试启动Neo4j的事务管理器)
0. 写在前面 到底遇到了什么问题? 简洁版: 在 Oracle 与 Neo4j 共存的多数据源项目中,一个仅涉及 Oracle 操作的请求,却因为 Neo4j 连接失败而报错。根本原因是 Spring 的默认事务管理器错误地指向了 Neo4j,导致不相…...
直线轴承在自动化机械设备中的应用
直线轴承作为机械传动系统中的关键部件,凭借其高精度、低摩擦和稳定性能,被广泛应用于各类自动化设备中。以下是直线轴承在自动化领域的典型应用场景: CNC机床 在数控机床的进给系统中,直线轴承与精密导轨配合使用,为刀…...
生物化学笔记:医学免疫学原理22 肿瘤及肿瘤治疗
肿瘤及肿瘤治疗 免疫疗法 CAR-T细胞介绍...
6.数据手册解读—运算放大器(二)
目录 6、细节描述 6.1预览 6.2功能框图 6.3 特征描述 6.3.1输入保护 6.3.1 EMI抑制 6.3.3 温度保护 6.3.4 容性负载和稳定性 6.3.5 共模电压范围 6.3.6反相保护 6.3.7 电气过载 6.3.8 过载恢复 6.3.9 典型规格与分布 6.3.9 散热焊盘的封装 6.3.11 Shutdown 6.4…...
010数论——算法备赛
数论 模运算 一般求余都是对正整数的操作,如果对负数,不同编程语言结果可能不同。 C/javapythona>m,0<a%m<m-1 a<m,a%ma~5%32~-5%3 -21(-5)%(-3) -2~5%(-3)2-1正数:(ab)%m((a%m)(b%m))%m~正数ÿ…...
算法01-最小生成树prim算法
最小生成树prim算法 题源:代码随想录卡哥的题 链接:https://kamacoder.com/problempage.php?pid1053 时间:2025-04-18 难度:4⭐ 题目: 1. 题目描述: 在世界的某个区域,有一些分散的神秘岛屿&…...
轻量化高精度的视频语义分割
Video semantic segmentation (VSS)视频语义分割 Compact Models(紧凑模型) 在深度学习中,相对于传统模型具有更小尺寸和更少参数数量的模型。这些模型的设计旨在在保持合理性能的同时,减少模型的计算和存储成本。 紧凑模型的设计可以涉及以下一些技术: 深度剪枝(Deep…...
【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)
背景: 终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。 已完成部分: 关于python调用大模型的,可以参考之前的…...
Android守护进程——Vold (Volume Daemon)
简介 介绍:Vold 是用来管理 android 系统的存储设备,如U盘、SD卡、磁盘等移动设备的热插拔、挂载、卸载、格式化 框架结构:Vold 在系统中以守护进程存在,是一个单独的进程。处于Kernel和Framework之间,是两个层级连接…...
【实体转换】mapstruct详解
大家好,我是jstart千语。今天来给大家讲讲在项目中经常可以使用得到的一个“工具”,就是mapstruct。 一、工具介绍 这个工具有些类似于spring提供的BeanUtils.copyProperties()用于对象转化。而mapstruct是通过生成高效的、类型安全的映射代码来帮助开发…...
部署路线Ubuntu_MySQL_Django_绑定域名
第 1 步:绑定域名(DNS) 在域名服务商后台(例如阿里云 / 腾讯云 / Cloudflare)中设置: A 记录 →域名 → 指向服务器公网 IP 可选:也加一个 www.域名 → 同样指向服务器 第 2 步:安…...
大屏设计与汇报:政务服务可视化实践
大屏设计与汇报:政务服务可视化实践 引言 在政务服务数字化转型浪潮中,大屏设计成为展现业务能力与数据价值的关键手段。本文围绕政务大屏设计,从设计要点、业务逻辑到汇报技巧展开深入探讨,为相关从业者提供全面参考。 一、大屏设计核心要点 (一)多维度考量 设计大…...
【MySQL】数据库和表的操作详解
目录 一、数据库: 1、查看数据库: 2、创建数据库: 3、删除数据库: 4、数据库的编码问题: 5、校验规则对数据库的影响: 6、修改数据库: 7、库的备份与恢复: 8、查看链接情况…...
从PDF到播客:MIT开发的超越NotebookLM的工具
NotebookLM是谷歌推出的更具创意的AI产品之一,几个月前刚刚推出。 许多人对它的能力感到惊叹——尤其是将长文本转化为两位播客主持人之间有趣对话的功能。 NotebookLM提供的不仅仅是这些,还包括聊天(问答)甚至生成思维导图。 如果你还没有尝试过NotebookLM,我强烈建议…...
ubuntu系统上基于RKE2部署K8S及Rancher
由于我们特殊的网络环境,所以只能使用国内资源来进行安装 - Rancher Releases Mirrors:https://mirror.rancher.cn/ - 阿里云镜像仓库:registry.cn-hangzhou.aliyuncs.com 1、配置资源仓库及token rootdemo-1:~# mkdir -p /etc/rancher/r…...
STM32单片机入门学习——第40节: [11-5] 硬件SPI读写W25Q64
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.18 STM32开发板学习——第一节: [1-1]课程简介第40节: [11-5] 硬件SPI读…...
vue3学习笔记之属性绑定
属性绑定 1. 基本语法 在 Vue 3 里,使用 : 或者 v-bind: 来进行属性绑定。这两种写法是等价的,: 是 v-bind: 的缩写形式。以下是示例代码: <template><!-- 使用缩写形式 --><img :src"imageUrl" alt"An exa…...
C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式
int A(参数...) override { return 某个对象.A(参数...);} 一.目标 本文将用一个简单的“数学运算器”例子,从零解释以下 C 语法特性: virtual 虚函数 override 重写关键字 函数体内部的“转发调用” 数组引用作为函数参数 适合初学者和希望加深…...
Spring_MVC 快速入门指南
Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC? Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(M…...
Starrocks 数据均衡DiskAndTabletLoadReBalancer的实现
背景 最近在研究了一下 Starrocks的tablet的Rebalance的能力,这里进行记录一下 本文基于 StarRocks 3.3.5 结论 数据的rebalance 主要以两种模式来进行: 按照磁盘的使用率进行移动,如果每个BE的磁盘使用率不足tablet_sched_balance_load_…...
设计模式之工厂方法模式
1. 核心思想 工厂方法模式(Factory Method Pattern)将对象的创建过程延迟到子类。具体来说,定义一个创建对象的接口(抽象工厂),但由子类决定实例化哪个具体类。这种方式解耦了对象的创建和使用,…...
ubuntu学习day3
3 编译与调试 3.1 gcc/g编译器 当我们进行编译的时候,要使用一系列的工具,我们称之为工具链。SDK就是编译工具链的简写,我们所使用的是gcc系列编译工具链。使用-v参数来查看gcc的版本,从而确定某些语法特性是否可用,…...