秋招Java后端开发冲刺——并发篇2(ThreadLocal、Future接口)

本文对ThreadLocal类和Future接口进行了总结概括,包括ThreadLocal类的原理、内存泄露等问题,和Future接口的使用等问题。

一、ThreadLocal

1. 介绍
ThreadLocal(线程局部变量)是Java中的一个类,线程通过维护一个本地变量副本,从而保证对该变量的访问不受其他线程的影响。
2. 实现原理

  • 每个线程中都有一个ThreadLocalMap 类型的threadLocals 变量和 一个 inheritableThreadLocals 变量
  • ThreadLocalMap是ThreadLocal的静态内部类,存储的是以ThreadLocal实例为 key ,Object 对象为 value 的键值对
  • 当调用ThreadLocal类实例的get和set方法修改变量值的时候实际上调用的是ThreadLocalMap类的get和set方法,数据实际存储在ThreadLocalMap中
    在这里插入图片描述
  • 源码

① get方法

public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T) e.value;return result;}}return setInitialValue();
}

② set方法

public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {map.set(this, value);} else {createMap(t, value);}
}ThreadLocalMap getMap(Thread t) {return t.threadLocals;
}void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);
}

3. 内存泄漏问题

(1)虚引用、弱引用、软引用和强引用

  • 虚引用:主要用于在对象被回收时,进行一些后续处理工作;必须和引用队列(ReferenceQueue)联合使用
  • 弱引用:主要用于实现规范化映射;当垃圾收集器运行时,无论内存是否充足都会回收这些对象
  • 软引用:要用于实现内存敏感的缓存;在垃圾收集器判断内存不足时,会回收这些对象
  • 强引用:当一个对象被强引用时,垃圾收集器不会回收该对象,即使内存不足也不会回收。通过new对象实例可以创建。

(2)ThreaLocal内存泄露是因为ThreadLocalMap 中的 key 为 ThreadLocal 的弱引用,而 value 是强引用,因此当垃圾回收时会回收ThreadLocal对象实例,而与之对应的value不会被回收,之后该value也不能再使用,由此导致内存泄露。
:使用ThreadLocal时一定要手动调用remove()方法

二、 Future接口

1. 介绍
Future 接口提供了一种处理异步计算结果的机制,通过使用 Future 和 其实现类FutureTask,可以方便地处理并发编程中的异步任务管理。
2. 常用方法

方法描述
boolean cancel(boolean mayInterruptIfRunning)尝试取消任务的执行。如果任务已完成或已被取消,返回 falsemayInterruptIfRunning 指示是否应该中断正在执行的任务。
boolean isCancelled()如果任务在完成前被取消,则返回 true
boolean isDone()如果任务已完成(无论是正常完成、异常终止还是取消),返回 true
V get() throws InterruptedException, ExecutionException等待任务完成并获取结果。如果任务执行过程中抛出异常,则抛出 ExecutionException。若当前线程被中断,抛出 InterruptedException
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException在指定时间内等待任务完成并获取结果。如果在指定时间内任务没有完成,抛出 TimeoutException。若任务执行过程中抛出异常,抛出 ExecutionException。若当前线程被中断,抛出 InterruptedException

3. CompletableFuture 和Future之间的区别与联系

特性FutureCompletableFuture
接口/类接口类(实现了 Future 和 CompletionStage 接口)
异步任务不能直接表示异步任务,只能表示异步任务的结果可以直接表示异步任务并提供丰富的异步编程支持
任务完成通知只能通过阻塞的 get 方法或轮询 isDone 方法检查任务是否完成提供 thenApply, thenAccept, thenRun 等方法来注册回调函数,在任务完成时自动执行
手动完成不支持手动完成任务提供 complete, completeExceptionally 等方法手动完成任务
组合多个任务不支持直接组合多个任务提供 allOf, anyOf 等方法来组合多个任务
异常处理只能通过捕获 ExecutionException 进行异常处理提供 exceptionally, handle, whenComplete 等方法进行异常处理
非阻塞获取结果不支持非阻塞地获取结果提供 join, getNow, orTimeout, completeOnTimeout 等方法非阻塞地获取结果或处理超时
支持流式 API不支持流式 API支持流式 API,允许通过链式调用编写更简洁和可读的异步代码

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

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

相关文章

一文带你彻底搞懂什么是责任链模式!!

文章目录 什么是责任链模式?详细示例SpingMVC 中的责任链模式使用总结 什么是责任链模式? 在我们日常生活中,经常会出现一种场景:一个请求需要经过多个对象的处理才能得到最终的结果。比如,一个请假申请,需…

STM32智能仓库管理系统教程

目录 引言环境准备智能仓库管理系统基础代码实现:实现智能仓库管理系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通…

藏汉翻译通作为翻译软件的优势有哪些?

藏汉翻译通作为一款专业的藏汉双语翻译软件,具有以下优势: 人工智能技术应用:藏汉翻译通利用了人工智能翻译和语音识别合成技术,提供智能藏文翻译服务。 高准确率:文字识别准确率可达90%,语音识别转化文字…

苍穹外卖--导入分类模块功能代码

把各层代码拷贝到所需文件夹下, 进行编译 在运行 提交和推送仓库

解锁AI大模型潜能:预训练、迁移学习与中间件编程的协同艺术

在人工智能的浩瀚星空中,大型预训练模型(Large Language Models, LLMs)犹如璀璨的星辰,引领着技术革新的浪潮。这些模型通过海量数据的滋养,学会了理解语言、生成文本乃至执行复杂任务的能力。然而,要让这些…

【正点原子i.MX93开发板试用连载体验】项目计划和开箱体验

本文最早发表于电子发烧友:【   】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)https://bbs.elecfans.com/jishu_2438354_1_1.html 有一段时间没有参加电子发…

Pyspider WebUI 未授权访问致远程代码执行漏洞复现

0x01 产品简介 Pyspider是由国人binux编写的强大的网络爬虫系统,它带有强大的WebUI(Web用户界面),为用户提供了可视化的编写、调试和管理爬虫的能力。这一特点使得Pyspider在爬虫框架中脱颖而出,尤其适合那些希望快速上手并高效开发爬虫的用户。允许用户直接在网页上编写…

Linux--线程的控制

目录 0.前言 1.pthread库 2.关于控制线程的接口 2.1.创建线程(pthread_create) 2.2.线程等待(pthread_join) 代码示例1: ​编辑 ***一些问题*** 2. 3.创建多线程 3.线程的终止 (pthread_exit /…

给数组/对象添加一个(key-value)对象

需要将一个value值前面加上key值,放进数组/对象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值。 结果:…

文华财经盘立方多空变色波段趋势线指标公式源码

文华财经盘立方多空变色波段趋势线指标公式源码&#xff1a; N1:20; N2:ROUND(N1/2,1); N3:ROUND(SQRT(N1),1); N4:2*EMA2(C,N2)-EMA2(C,N1); 尊重市场:EMA2(N4,N3),COLORRED,LINETHICK2; 尊重市场1:IF(尊重市场<REF(尊重市场,1), 尊重市场,NULL),COLORGREEN,LINETHIC…

C++之List模拟实现

目录 list的逻辑结构 构造函数 拷贝构造函数 赋值运算符重载 返回迭代器的初始位置 返回迭代器的最终位置 元素的插入 头插 尾插 删除元素 头删 尾删 清空整个链表 析构函数 正向迭代器 反向迭代器 整体代码 上期我们学写了list的基本操作&#xff0c;本期我…

苏东坡传-读书笔记十一

苏东坡对写作与风格所表示的意见最为清楚。他说做文章“大略如行云流水&#xff0c;初无定质&#xff0c;但常行于所当行&#xff0c;常止于所不可不止。文理自然&#xff0c;姿态横生。孔子曰&#xff1a;‘言之不文&#xff0c;行而不远。’又曰&#xff1a;‘辞达而已矣。’…

STC32G/F/8H通用无刷电机驱动板

STC32G/F/8H通用无刷电机驱动板 &#x1f4cc;相关篇《低成本STC32G8K64驱动控制BLDC开源入门学习方案》 ✨该驱动板是在上一版的基础上改版而来。这里的STC32G/F/8H所指的是封装型号为-LQFP48的STC32G8K64、STC32G12K128、STC32F12K54、STC8H8K64U。是一款兼容有感和无感设计的…

【Java算法】二分查找 下

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接&#xff1a;852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

玩具营销是如何拿捏成年人钱包?

好像现在的成年人逐渐热衷于偏向年轻化&#xff0c;问问题会好奇“尊嘟假嘟”&#xff0c;饭量上的“儿童套餐”&#xff0c;娃娃机前排长队......而最突出的莫过于各类各式的玩具不断收割当代年轻人&#xff0c;除去常给大朋友们小朋友们送去玩具福利的“麦、肯”双门&#xf…

激光干涉仪可以完成哪些测量:全面应用解析

在高端制造领域&#xff0c;精度是衡量产品质量的关键指标之一。激光干涉仪作为一项高精度测量技术&#xff0c;其应用广泛&#xff0c;对于提升产品制造精度具有重要意义。 线性测量&#xff1a;精确定位的基础 激光干涉仪采用迈克尔逊干涉原理&#xff0c;实现线性测量。该…

卷积神经网络之ResNet50迁移学习

数据准备 下载狗与狼分类数据集&#xff0c;数据来自ImageNet&#xff0c;每个分类有大约120张训练图像与30张验证图像。使用download接口下载数据集&#xff0c;并自动解压到当前目录。 全是小狗的图片 另一边全是狼的图片 加载数据集 狼狗数据集提取自ImageNet分类数据集&a…

2-3个月的幼猫能吃主食冻干吗?第一次吃哪款主食冻干比较好

2-3个月的幼猫能吃冻干吗&#xff1f;一般来说&#xff0c;幼猫在2-3个月左右的离乳期就可以吃冻干了。需要注意的&#xff0c;一个是要认准主食冻干&#xff0c;零食冻干会让猫猫从小就挑食&#xff0c;以后就更不好纠正了。而且离乳期的猫猫没有了母乳的保护&#xff0c;免疫…

Open3D 点对面的ICP算法配准(精配准)

目录 一、概述 1.1核心思想 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 3.3计算数据 一、概述 基于点对面的ICP&#xff08;Iterative Closest Point&#xff09;配准算法是ICP的一种变体&#xff0c;它通过最小化源…

【Ty CLI】一个开箱即用的前端脚手架

目录 资源链接基础命令模板创建命令帮助选择模板开始创建开发模板 开发背景npm 发布流程问题记录模板创建超时 更新日志 资源链接 文档&#xff1a;https://ty.cli.vrteam.top/ 源码&#xff1a;https://github.com/bosombaby/ty-cli 基础命令 1. npm 全局安装 npm i ty-cli…