开启多线程下变量共享与私有问题
开启多线程下变量共享与私有问题
🌵ThreadLocal和Atomic是Java中用于多线程编程的两个重要工具。
ThreadLocal是一个线程局部变量,它为每个线程提供了独立的变量副本,确保每个线程都可以访问自己的变量副本而不会影响其他线程的变量。在多线程环境下,使用ThreadLocal可以避免线程安全问题。
Atomic是一组原子操作类,提供了一些常见的原子操作,如原子更新整型、原子更新引用等。在多线程环境下,使用Atomic可以保证操作的原子性,避免出现数据竞争和线程安全问题。
🎯下面是一个简单的示例ThreadLocal和Atomic在多线程环境下的用法:
import java.util.concurrent.atomic.AtomicInteger;public class ThreadLocalAndAtomicExample {private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);private static AtomicInteger atomicInteger = new AtomicInteger(0);public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {int localValue = threadLocal.get();localValue++;threadLocal.set(localValue);int atomicValue = atomicInteger.incrementAndGet();System.out.println("ThreadLocal value: " + threadLocal.get() + " Atomic value: " + atomicValue);}).start();}}
}
在上面的示例中,我们创建了一个ThreadLocal变量和一个AtomicInteger变量,然后启动了5个线程,每个线程对这两个变量进行操作。通过输出结果可以看到,ThreadLocal变量在每个线程中独立维护了自己的值,而AtomicInteger变量则保证了操作的原子性。
总结来说,在多线程编程中,ThreadLocal可以用于保证每个线程拥有独立的变量副本,避免线程安全问题;而Atomic可以用于保证操作的原子性,避免数据竞争和线程安全问题。在实际开发中,我们可以根据具体需求选择合适的工具来保证多线程程序的正确性和性能。
🎯下面是一个类似的示例,多线程使用EasyExcel处理导出数据,使用ExecutorService、CountDownLatch、ThreadLocal和Atomic在多线程环境下的用法:
public void exportAllApply(HttpServletResponse response, ApplyScope applyScope){SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");String fileName = "APPLY" + +"-"+Calendar.getInstance().getTimeInMillis()+".xlsx";List<ApplyExportVo> allApply = new ArrayList<>();try {ExcelWriter excelWriter = EasyExcel.write(fileName, ApplyExportVo.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("sheet1").build();int threadCount = 5;//默认开启五个线程ExecutorService executorService = Executors.newFixedThreadPool(threadCount);CountDownLatch latch = new CountDownLatch(threadCount);ThreadLocal<ApplyScope> threadLocalApply = ThreadLocal.withInitial(ApplyScope::new);AtomicLong updatePage = new AtomicLong(1);for (int i = 0; i < threadCount; i++) {int finalI = i+1;executorService.execute(() -> {ApplyScope localApply = threadLocalApply.get();BeanUtils.copyProperties(applyScope,localApply);while (true) {long currentPage = updatePage.getAndIncrement();//更新分页信息,需同步updatePage(localApply, currentPage);ApplyGeneralVo applyGeneralVo = this.queryApplyView(localApply);List<ApplyVo> applyList = applyGeneralVo.getApplyList();log.info("线程threadCount:"+finalI+"当前页码"+currentPage+",数量"+applyList.size());if(CollectionUtils.isEmpty(applyList)){break;}List<ApplyExportVo> exportVos = BeanUtil.toBeanList(applyList, ApplyExportVo.class);allApply.addAll(exportVos);}latch.countDown();});}executorService.shutdown();latch.await();Long startWrite = Calendar.getInstance().getTimeInMillis();Optional.ofNullable(allApply).ifPresent(data -> {excelWriter.write(data, writeSheet);});excelWriter.finish();log.info("----- writeExcelTime:" + (Calendar.getInstance().getTimeInMillis() - startWrite));} catch (Exception e) {e.printStackTrace();}
}private synchronized long updatePage(ApplyScope scope, long current){PageScope page = scope.getPages();if(page == null){page = new PageScope();page.setSize(1000L);page.setCurrent(current);scope.setPages(page);} else {page.setCurrent(current);}return page.getCurrent();
}
🚩在上面的示例中,我们创建了一个固定大小的线程池ExecutorService,并使用CountDownLatch来等待所有线程执行完毕。每个线程在执行时会对ThreadLocal变量和AtomicInteger变量进行操作,并在操作完成后调用CountDownLatch的countDown()方法来通知主线程。
通过输出结果可以看到,每个线程中的ThreadLocal变量和AtomicInteger变量都能够正确地保持独立和原子性,同时CountDownLatch确保了所有线程执行完毕后主线程才会继续执行。
相关文章:
开启多线程下变量共享与私有问题
开启多线程下变量共享与私有问题 🌵ThreadLocal和Atomic是Java中用于多线程编程的两个重要工具。 ThreadLocal是一个线程局部变量,它为每个线程提供了独立的变量副本,确保每个线程都可以访问自己的变量副本而不会影响其他线程的变量。在多线…...

Qt模型视图代理之QTableView应用的简单介绍
往期回顾 Qt绘图与图形视图之绘制带三角形箭头的窗口的简单介绍-CSDN博客 Qt绘图与图形视图之Graphics View坐标系的简单介绍-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客 Qt模型视图代理之QTableView应用的简单介绍 一、最终效果 二、设计思路 这里…...

第七届精武杯部分wp
第一部分:计算机和手机取证 1.请综合分析计算机和手机检材,计算机最近一次登录的账户名是 答案:admin 创建虚拟机时直接给出了用户名 2. 请综合分析计算机和手机检材,计算机最近一次插入的USB存储设备串号是 答案:…...

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex
Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…...
整合 Java, Python 和 Scrapy 爬虫以传递和使用参数
这篇博客将详细说明如何从 Java 应用程序调用一个 Python 脚本,并在此过程中传递参数给一个 Scrapy 爬虫。最终目标是让 Java 控制爬虫的行为,如爬取数量和特定的运行参数。 一、Scrapy 爬虫的修改 首先,我们需要确保 Scrapy 爬虫能接收从命…...
Android 蓝牙实战——蓝牙音乐播放进度(二十)
对于蓝牙音乐的开发来说,播放进度是一个比较重要的数据参数,这里我们就来分析一下蓝牙音乐播放进度的相关回调。 一、回调流程 1、AvrcpControllerService 源码位置:/packages/apps/Bluetooth/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java /…...

SQL注入实例(sqli-labs/less-1)
初始网页 从网页可知传递的参数名为 id,并且为数字类型 1、得知数据表有多少列 1.1 使用联合查询查找列数(效率低) http://localhost/sqli-labs-master/Less-1/?id1 union select 1,2 -- 1.2 使用order by查找列数(效率高&…...

Python中tkinter编程入门3
在使用tkinter创建了窗口之后,可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤,一是创建标签控件,二是将创建好的标签“放置”到窗口上。 1.1 创建标签…...

XMind 2023 v23.05.2660软件安装教程(附软件下载地址)
软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! XMind 2023 v23.05.2660被视为顶尖思维导图软件,其界面简洁清爽,功能布局直观简单,摒弃繁复不实。尽管体积小巧&a…...

docker compose kafka集群部署
kafka集群部署 目录 部署zookeeper准备工作2、部署kafka准备工作3、编辑docker-compose.yml文件4、启动服务5、测试kafka6、web监控管理 部署zookeeper准备工作 mkdir data/zookeeper-{1,2,3}/{data,datalog,logs,conf} -p cat >data/zookeeper-1/conf/zoo.cfg<<EOF…...

最新版在线客服系统源码
源码介绍 首发最新在线客服系统源码,优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图...

【比邻智选】MR880A模组
🚀高性价比,5G/4G双模,稳定可靠 🌐功能丰富,5G特性一应俱全 🧩多封装兼容,适配性强,灵活升级智能设备...
超大文件去除重复数据
背景 一个超大200万行文件 第一列是文件名 第二列是文本 第一列有重复的文件名 如何删除重复的文件名和对应的文本 awk ‘!seen[$1]’ 使用一些命令行工具来处理大文件,如awk、sed、grep等。 使用awk命令来去除重复行: bash awk !seen[$1] your_file.…...

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习
ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…...

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明
很多Mac的新用户在使用电脑的过程中,常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统,总觉得Mac系统用得很难上手。 其实,用户可以在Mac上安装CrossOver,它支持用户在Mac上运行Windows软件,例…...

C++学习————第十天(string的基本使用)
1、string 对象类的常见构造 (constructor)函数名称 功能说明: string() (重点) 构造空的string类对象,即空字符串 string(const char* s) (重点)…...
华为OD介绍
概念 华为OD是华为提出的一种新的用工方式,其全称是Outsourcing Dispacth,也可以简写为ODP,是华为和北京外企德科人力资源服务上海有限公司联合招聘的简称。华为OD岗位属于华为外包员工的一种,仅限于软件研发类岗位,类…...

判断点在多边形内部
0. 介绍 网上资料很多,只简单介绍下,方便自己今后的理解。 1. 射线法 从该点引一条射线出来,如果和多边形有偶数个交点,则点在多边形外部。 因为有入必有出,所以从外部引进来的射线一定是交多边形偶数个点。 如图…...
livox雷达斜装修改
fast_lio中的mid360.yaml中的外参 extrinsic_est_en: false # true: enable the online estimation of IMU-LiDAR extrinsicextrinsic_T: [ -0.011, -0.02329, 0.04412 ]extrinsic_R: [ 1, 0, 0,...

【Spring】初识 Spring AOP(面向切面编程)
目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP(Aspect Orient Programming),直译过来就是面向切面编程,AOP 是一…...

如何在 Windows 11 中永久更改默认浏览器:阻止 Edge 占据主导地位
在 Windows 11 中更改默认浏览器对于新手或技术不太熟练的用户来说可能会令人沮丧。 为什么要在 Windows 11 中更改默认浏览器? 这是一个重要的问题:你为什么要从 Microsoft Edge 切换过来? 生态系统集成:如果你已经在广泛使用 Google 服务,Chrome 可以提供无缝集成。同…...

基于深度学习的无人机轨迹预测
完整代码见文末 随着无人机技术的不断发展,无人机在农业、物流、监控等领域的应用日益广泛。精准的轨迹预测不仅能够提高无人机飞行的效率和安全性,还能在应对复杂环境下的突发状况时做出迅速反应。因此,基于深度学习的无人机轨迹预测已成为…...
嵌入式学习笔记- freeRTOS 带FromISR后缀的函数
FreeRTOS中带FromISR后缀的函数 是用于中断的函数,它有两个特点 一个是无等待延时, 一个是无立刻触发任务切换, 那么 一 为什么中断中不能等待(阻塞)? 因为中断中等待的,一般都是任务给予的…...
从零开始的数据结构教程(六) 贪心算法
🍬 标题一:贪心核心思想——发糖果时的最优分配策略 贪心算法 (Greedy Algorithm) 是一种简单直观的算法策略。它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望得到一个全局最优解。这就像你…...
Vue2数组数字字段求和技巧 数字求和方法
<template><div><p>总和: {{ totalSum }}</p></div> </template><script> export default {data() {return {items: [{ id: 1, value: 10 },{ id: 2, value: 20 },{ id: 3, value: 30 }]};},computed: {totalSum() {return this.ite…...
java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件
四重验证机制: 文件扩展名检查(.xlsx/.xls)MIME类型检查文件魔数验证(真实文件类型)可执行文件特征检测 防御措施: 使用try-with-resources确保流关闭限制文件大小防止DoS攻击使用Apache POI的FileMagic进…...

pytorch基本运算-导数和f-string
引言 在前序对机器学习的探究过程中,我们已经深刻体会到人工智能到处都有微分求导运算,相关文章链接包括且不限于: BP神经网络 逻辑回归 对于pytorch张量,求导运算必不可少,所以本次就专门来学习一下。 f-string的用…...

深度学习和神经网络 卷积神经网络CNN
1.什么是卷积神经网络 一种前馈神经网络;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点:通过卷积操作自动提取空间局部特征(如纹理、边缘),显著降低参数量 2.CNN的三个结构特征 局部连接&a…...
深度探索:如何用DeepSeek重构你的工作流
前言:AI时代的工作革命 在人工智能浪潮席卷的今天,DeepSeek作为国产大模型的代表之一,正以其强大的自然语言处理能力、代码生成能力和多模态交互特性,重新定义着人类的工作方式。根据IDC报告显示,2024年企业级AI应用市场规模已突破800亿美元,其中智能办公场景占比达32%,…...
Neo4j 认证与授权:原理、技术与最佳实践深度解析
Neo4j 作为领先的图数据库,其安全机制——认证(Authentication)与授权(Authorization)——是保障数据资产的核心防线。本文将深入剖析其工作原理、关键技术、实用技巧及行业最佳实践,助您构建坚不可摧的图数据安全体系。 Neo4j 提供了强大且灵活的认证授权框架,涵盖从基…...