【并发编程笔记】 ---- ThreadLocal原理及线程池内存泄露案例

本文深入探讨ThreadLocal,包括其使用示例、源码分析以及在线程池中可能导致内存泄露的场景。重点阐述ThreadLocal如何实现线程隔离,弱引用特性以及避免内存泄露的方法。
摘要由CSDN通过智能技术生成

目录

1. ThreadLocal
2. ThreadLocal使用示例
3. ThreadLocal源码分析
4. 线程池使用ThreadLocal导致的内存泄露案例解析

1. ThreadLocal

ThreadLock是JDK包提供的,它提供了线程本地变量,也就是如果创建了一个ThreadLocal变量,访问这个变量的每个线程都会有这个变量的一个本地副本。
当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLock变量后,每个线程都会复制一个变量到自己的本地内存

ThreadLocal实例通常是类中的private static字段,它们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。

ThreadLocal定义了四个常用方法:

  • get() : 返回此线程局部变量的当前线程副本的值
  • initialValue(): 返回此线程局部变量的当前线程的"初始值"
  • remove(): 移除此线程局部变量当前线程的值
  • set(T value): 将此线程局部变量的当前线程副本中的值设置为指定值

除了这四个方法,ThreadLocal内部还有一个静态内部类ThreadLocalMap,该内部类才是实现线程隔离机制的关键,get()、set()、remove()都是基于该内部类操作。ThreadLocalMap提供了一种用键值对方式存储每一个线程的变量副本的方法,key为当前ThreadLocal对象,value则是对应线程的变量副本。

  1. ThreadLocal实例本身不存储值,它只是提供了一个在当前线程中找到副本值的key
  2. ThreadLocal包含在Thread中

1. ThreadLocal使用示例

public class ThreadLocalTest {
   

	// print函数
	static void print(String str) {
   
		// 1.1 打印当前线程本地内存中的localVariable变量的值
		System.out.println(str + ":" + localVariable.get());

		// 1.2 清除当前线程本地内存中的localVariable变量
//		localVariable.remove();
	}

	// 创建ThreadLocal变量
	private static ThreadLocal<String> localVariable = new ThreadLocal<>();

	public static void main(String[] args) {
   
		// 创建线程one
		Thread threadOne = new Thread(new Runnable() {
   
			@Override
			public void run() {
   
				// 设置线程one中本地变量的localVariable的值
				localVariable.set("threadOne local variable");
				// 调用打印函数
				print("threadOne");
				// 打印本地变量值
				System
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值