Android中ThreadLocal的使用方式是怎样的

Android:ThreadLocal的简单理解和使用 1、本质是操作线程中来实现本地线程变量的存储的2、是采用数组的方式来存储数据,其中key(弱引用)指向当前对象,value为设的值3、为内存泄漏采取了处理措施,在调用的方法的时候都会清除线程里所有key为null的Entry4、在使用的时候,我们仍然需要注意,避免使用static的,分配使用了后,一定要根据当前线程的生命周期来判断是否需要手动的去清理中清key==null的Entry。 阅读详情

在 Android 中,ThreadLocal 的使用方式与 Java 中的使用方式类似。ThreadLocal 是一个线程局部变量,它为每个线程提供独立的变量副本。下面是 ThreadLocal 的基本使用方式及其常见模式:

1. 创建 ThreadLocal 实例

ThreadLocal 实例可以通过 ThreadLocal 类的构造函数创建。你可以使用 ThreadLocal.withInitial 方法来提供一个初始化值。

示例:

// 创建一个 ThreadLocal 实例,初始化值为 0
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

2. 设置和获取值

使用 set 方法设置当前线程的值,使用 get 方法获取当前线程的值。

示例:

// 设置当前线程的值
threadLocal.set(42);

// 获取当前线程的值
Integer value = threadLocal.get();

3. 清除值

使用 remove 方法可以清除当前线程的值,这有助于避免内存泄漏,尤其是在长生命周期的线程池中。

示例:

// 清除当前线程的值
threadLocal.remove();

4. 典型使用场景

4.1 会话管理

在需要为每个线程维护独立的会话信息时,可以使用 ThreadLocal。

示例:

public class SessionManager {
    private static ThreadLocal<UserSession> userSession = ThreadLocal.withInitial(UserSession::new);

    public static UserSession getSession() {
        return userSession.get();
    }

    public static void setSession(UserSession session) {
        userSession.set(session);
    }

    public static void clearSession() {
        userSession.remove();
    }
}

class UserSession {
    // 用户会话数据
}
4.2 数据库连接

每个线程可以拥有自己的数据库连接实例,避免多个线程共享同一连接。

示例:

public class DatabaseConnectionManager {
    private static ThreadLocal<Connection> connectionHolder = ThreadLocal.withInitial(() -> {
        // 创建和返回新的数据库连接
        return createNewConnection();
    });

    public static Connection getConnection() {
        return connectionHolder.get();
    }

    public static void setConnection(Connection connection) {
        connectionHolder.set(connection);
    }

    public static void clearConnection() {
        connectionHolder.remove();
    }

    private static Connection createNewConnection() {
        // 创建新的数据库连接
        return new Connection();
    }
}
4.3 日志记录

在多线程环境中,维护独立的日志记录器实例。

示例:

public class Logger {
    private static ThreadLocal<Log> threadLocalLog = ThreadLocal.withInitial(Log::new);

    public static void log(String message) {
        threadLocalLog.get().addEntry(message);
    }

    public static void clearLog() {
        threadLocalLog.remove();
    }
}

class Log {
    private List<String> entries = new ArrayList<>();

    public void addEntry(String message) {
        entries.add(message);
    }

    // 其他日志相关的方法
}

5. 在 Android 中的使用

在 Android 中,ThreadLocal 的使用方法与标准 Java 相同,但考虑到 Android 的线程模型和生命周期管理,有几个额外的注意事项:

  • 避免内存泄漏:在长生命周期的线程(如线程池)中使用 ThreadLocal 时,确保正确清除 ThreadLocal 的值以避免内存泄漏。
  • UI 线程:在 Android 的主线程(UI 线程)中,ThreadLocal 可用于维护与 UI 相关的线程局部数据。

示例:

public class MainThreadHandler {
    private static ThreadLocal<Handler> mainThreadHandler = ThreadLocal.withInitial(() -> new Handler(Looper.getMainLooper()));

    public static Handler getHandler() {
        return mainThreadHandler.get();
    }

    public static void clearHandler() {
        mainThreadHandler.remove();
    }
}

总结

在 Android 中使用 ThreadLocal 时,通常用于在多线程环境中管理线程局部的数据。ThreadLocal 提供了一种简单且高效的方式来确保每个线程有自己的数据副本,避免线程间数据干扰和同步问题。正确使用 ThreadLocal 可以帮助提高应用程序的性能和稳定性,但也需注意内存管理,确保在不需要时清除 ThreadLocal 的值。

Android ThreadLocal实现原理 主要介绍ThreadLocal的原理,实例分析以及注意事项 立即下载

相关推荐

亿佰特E77模块(STM32WLE5CCU6)LoRa通信实战指南:从配置到应用开发

本文详细介绍了亿佰特E77模块(STM32WLE5CCU6)的LoRa通信实战指南,从硬件配置到应用开发。基于ARM Cortex-M4内核的E77模块集成了LoRa射频前端,具备超低功耗和硬件级抗干扰特性,适用于智能农业、工业现场等场景。文章提供了开发环境搭建、LoRa参数配置、实战通信及性能优化等实用技巧,帮助开发者快速掌握LoRa通信技术。

weixin_29164185的博客 760

ThreadLocal的作用以及实现原理

ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只能在指定的线程中获取存储的数据,对于其他线程来说则是无法获取到的。Looper、ActivityThead以及AMS中都用到了TheadLocal。 一、某些数据是以线程为作用域并且不同线程具有不同的数据副本。比如 Handler,它需要获取当前线程的Looper,Looper的作用域就是线程并且不同线程对应不同的Looper,此时可以通过ThreadLocal实现Looper在线程中的存取。 二、复杂逻辑下

故不积跬步无以至千里 5060

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

Android ThreadLocal

1.ThreadLocal ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中才可以访问,其他线程无法获取。 使用场景: ①当某些数据是以线程为作用域且不同线程之间具有不同数据副本的时候,就可以考虑使用ThreadLocal。 Android的Handler消息机制中,Looper的作用域就是线程且不同线程之间具有不同的Looper,这里使用的就是ThreadLocal对Looper与线程进行关联,如果不使用ThreadLoca

zenmela2011的专栏 2333

Vitis Model Composer闪退?手把手教你用命令行启动Vivado 2021后的System Generator

本文详细解析了Vitis Model Composer闪退问题的根本原因,并提供了命令行启动Vivado 2021后System Generator的完整解决方案。从环境变量配置、组件缺失排查到权限问题处理,手把手教你通过命令行深度排错,并分享高级自动化脚本和系统优化技巧,帮助开发者高效使用Vitis Model Composer与System Generator进行HDL开发。

weixin_26905487的博客 348

开发基于GDL235KBQ6开发板的IAP升级程序(HEX协议+串口空闲中断 + DMA接收数据)

使用GDL235kB开发板,实现串口iap升级程序的bootloader代码编写,app为led灯闪烁,并完成通信c代码

zhaozijuncc的博客 642

ThreadLocal 的详细使用指南

•。

tang_sy的博客 1926

快速谱峭度算法解析

最近一直在研究振动信号的最优解调带宽寻找方法,而快速谱峭度算法是最常见的一种,因此本篇文章准备对该算法做个深入解析,也相当于自己的学习记录了。本篇文章对快速谱峭度算法做了一个较为详细的介绍,实际上就是通过多组滤波器将信号分解到不同的频段,再计算每个频段的峭度,从而找到值最大的频段,进一步地我们也可以选取其他指标作为频段的选择,以便更好地找到振动信号中的故障信息。

qq1234534215的博客 2742

Android基础进阶 - 消息机制 之ThreadLocal

这是我们该如何设计呐?可能我们首先想到的是通过Map的方式,Key来存储Thread(eg:ThreadId),Value来存储每个Thread中该变量的值。在对map的读写操作上加上同步锁,即可实现上面场景的需求。但是这种方案由于加了锁,会带来一定的性能损耗,是否还有更好的方式来实现线程隔离呐?今天分析的ThreadLocal就是为此而设计的,它适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。

2501_90401221的博客 1284

[SV]SystemVerilog学习笔记之struct & union

SystemVerilog学习笔记(四) 一、结构体(struct) 1.1、结构体(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct{ //通过var进行结构体变量声明 logic [31:0] a, b; logic [ 7:0] opcode; } Instruction_Word_var; wire struct{ //结构体线网声明,定义为线网类型时,结构体的所有成员必须...

元直的博客 1万+

stop pin/ignore pin/exclude pin/float pin

stop pin、ignore pin、exclude pin、float pin的区别

m0_61544122的博客 7289

Android 线程本地变量<一> ThreadLocal源码解析

Android 线程本地变量<一> ThreadLocal源码解析@(Android系统源码解析)[Android, ThreadLocal]声明:转载请注明出处,知识有限,如有错误,请多多交流指正!Android 线程本地变量一 ThreadLocal源码解析ThreadLocal定义和作用 ThreadLocal代码使用 ThreadLocal源码解析注:基于Android 6.0(API 23

Android Daily 2083

华为OD 面试手撕代码真题【岛屿的周长】

0代表水,1代表陆地,岛由陆地组成且岛内不允许有湖,让你求岛的周长。

MISAYAONE的博客 8417

Android ThreadLocal 机制

在看Android Handler 时遇到了ThreadLocal这个东东,不知到它是干什么的,上网查了查,理解如下: 在 Android 中ThreadLocal并不是存储Thread或者标记Thread所用,它的作用就是: 在不同线程中,修改变量时只是修改了该

2044

Proteus 8.9免安装版本、Proteus 8 Professional 8.9免安装版本

Proteus 8.9免安装版本、Proteus 8 Professional1、解压到D盘2、打开D盘的Proteus 8 Professional文件夹3、进入BIN文件夹4、打开LICENCE.EXE应用程序进行安装密钥5、选中左边的Mr Wang(123456789@qq.com)6、点击下面的Install7、点击“是”(两边都有Mr Wang(123456789@qq.com))8、关闭窗口9、找到当前文件夹的PDS.EXE,右击“发送” “桌面快捷方式”,关闭窗口10、在桌面,可以将(PDS.EXE - 快捷方式)命名为“Proteus 8 Professional”11、打开Proteus 8 Professional就可以用了

T-BOX-设计方案介绍.pdf

T-BOX-设计方案介绍

Android中的ThreadLocal

ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。 在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。 同时,当某些数据是以线程为作用域并且不同线程具有不同的数据副本时,或者需要在复杂逻辑(调用栈比较深已

u010307119的博客 619

CN05.1全国【日尺度风速】格点观测数据-Win-1961-2023-025x025分辨率

本资源为CN05.1高分辨率气候格点数据产品,覆盖整个中国大陆,时间范围为 1961—2023年,空间分辨率为 0.25°×0.25°,数据变量为日平均风速(Win, m/s),由国家气象信息中心提供的2400多地面观测站日值数据经过严格质量控制、插值融合与格点化处理生成。【注意】:由于数据量较大,在这里仅放了2019-2023年数据,1961-2018年数据存储于百度网盘中,可通过资源中txt文件附带的下载链接自行下载,给大家造成的不便敬请谅解。在技术方法上,CN05.1数据集基于改进型薄板样条插值算法(Improved Thin Plate Spline, TPS),并结合数字高程模型(DEM)的地形校正项,以充分考虑地形起伏、站点密度及空间相关性。其插值过程使用1961年以来全国2400余个地面台站的长期序列观测数据,经过异常值检测、系统偏差订正与逐日平滑处理,保证了数据的时空连续性与气候一致性。该风速数据已在中国区域气候变化、风能资源评估、气象要素重分析对比及水文气候模拟等多个领域得到广泛应用。其主要优点包括:长时间序列一致性强:覆盖1961年至2023年,共63年日尺度连续数据;空间精度高:分辨率0.25°(约25公里),能较好反映地形起伏对风速分布的影响;气候适用性好:适用于区域气候变化检测、极端风速事件统计、风能潜力评估等多种研究场景。数据以NetCDF(.nc)格式存储,遵循CF(Climate and Forecast)气候数据标准命名规范,研究人员可在Python(xarray、netCDF4)、MATLAB、NCL或ArcGIS Pro等软件中直接读取与可视化分析。该数据集为气候动力分析、风能资源区划、陆面过程模拟、极端风事件归因研究提供了重要支撑,是中国高分辨率气候数据产品体系中重要的风速观测格点数据之一。

ThreadLocal使用以及实现原理

ThreadLocal使用 2、ThreadLocal使用场景 3、ThreadLocal实现原理

IT从业者,生活精致一点,工作认真一点! 619

基于stm32单片机硬件SPI接口驱动AD7124模数转换芯片程序源代码.zip

基于stm32单片机硬件SPI接口驱动AD7124模数转换芯片程序源代码nt32_t AD7124_ReadRegister(ad7124_device *device, ad7124_st_reg* pReg);/*! Writes the value of the specified register. */int32_t AD7124_WriteRegister(ad7124_device *device, ad7124_st_reg reg);/*! Reads the value of the specified register without a device state check. */int32_t AD7124_NoCheckReadRegister(ad7124_device *device, ad7124_st_reg* pReg);/*! Writes the value of the specified register without a device state check. */int32_t AD7124_NoCheckWrit

2022面试Android之ThreadLocal

针对一个对象,每个线程需要存储不同的值的时候,使用ThreadLocal会非常的方便。图解:针对一个全局变量local,线程1-4都持有local的引用。当线程分别对local进行修改后,其实修改作用域仅限当前线程可用。

GGGL的专栏 615

Android与Java中的ThreadLocal

每次的学习都应该记录下来~!~!文章代码来自:(Android19,java1.7)这几天看Android的Handle、Loop、Message。以前自己总是在用但没有仔细的去看过源码,查看源代码的时候发现ThreadLocal这个类的使用。这时发现好熟悉EvenBus里面好像也用到了这个类,于是在网上翻看了好多关于ThreadLocal的文章。ThreadLocal的作用是提供线程内的局部变量,

stven_king的专栏 1665

ThreadLocal详解

参考: https://blog.youkuaiyun.com/hzw19920329/article/details/51707232 说明: 参考源码为Android2.3-4.4,请读者注意 , 不同的版本有所差异! 今天在复习Handler消息处理机制原理的时候,发现自己对android的ThreadLocal部分理解还不是很到位,在此做个总结,先来说说为什么会在Handler消息处理机制中出现ThreadLocal这个东西吧,我们都知道Handler发送消息到MessageQueue中,Looper从Mess

Hello world !!! 261

ThreadLocal类的使用

维持线程封闭性的一种更规范方法是使用ThreadLocal,这个类能使线程中的某个值与保存值得对象关联起来。ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值。          ThreadLocal对象通常用于防止对可变的单实例变量(Singleton)或全局变量进行共享。

gdfdfg的专栏 282

Android消息机制之ThreadLocal浅析

概述 ThreadLocal 不是 Thread,它是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,对数据存储后,只有在指定线程中才可以获取到存储的数据,对于其他线程来说则是无法获取到数据的。 日常开发中用到 ThreadLocal 的场景不多,但是在 Android 系统中的 Looper、 ActivityThread、 AMS 等源码都用到了ThreadLocal。一般来说,当...

hust_twj的专栏 602

ThreadLocal理解

看了很多ThreadLocal的文章都是说ThreadLocal是用来为每个使用该变量的线程创建一个独立的副本,但是心里还是很疑惑为什么要这样子,用个局部变量不就好了吗? 后面看了一下android中Handler相关的源码,发现Looper中有一个ThreadLocal sThreadLocal 在HandlerThread中使用mLooper = Looper.myLooper();来获

u011421721的博客 220

ThreadLocal学习

1.作用 主要做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境下,如何防止自己的变量被其他线程修改 2.使用场景 Spring实现事务隔离级别的源码:Spring采用ThreadLocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接 . Spring框架里面就是用的ThreadLocal来实现这种隔离,主要在TransactionSynchronizationManager这个类中 在Android中,Looper类就是利用了ThreadLoc

Shi_MiaoXuan的博客 194

Android如何保证一个线程最多只能有一个Looper

如下图所示,我们可以将ThreadLocal理解为一块存储区,将这一大块存储区分割为多块小的存储区,每一个线程拥有一块属于自己的存储区,那么对自己的存储区操作就不会影响其他线程。既然与特定线程相关,所以先获取当前线程,然后获取当前线程特定存储,即Thread中的localValues,若localValues为空,则创建一个,最后将value存入values中。换句话说,通过使用 threadLocal 存储对象,线程和线程之间的彼此的数据就会隔离起来,从而保证了彼此线程的数据安全和独立性。

2401_87287253的博客 1099

理解Handler,Looper,MessageQueue,ThreadLocal关系

理解Handler,Looper,MessageQueue,ThreadLocal关系 ThreadLocal简单介绍 源码分析Looper,messagequeue,handler 关系总结 1、ThreadLocal介绍 ThreadLocal是一个线程内部的数据存储类,对于存储和获取数据都只能在对应的线程中,线程间的数据相互不影响,所以在处理并发时,可以使用线程安全机制(锁)

yougliu的专栏 878

Android消息机制中Handler切换线程的思考

对Handler通信机制的原理解析

Franous的博客 1956
上一篇: Android中ThreadLocal适用于什么场景
下一篇: Android中ThreadLocal的实现原理是怎样的
彬_小彬
博客等级 码龄10年 574粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬_小彬

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值