多线程与高并发学习笔记(三)

ThreadLocal

ThreadLocal线程局部变量,每个线程都维护一个ThreadLocal相关的地址空间,相当于每个线程都有一个自己的数据保存地,不会互相影响;以空间换时间的策略。

原理分析

在这里插入图片描述
分析ThreadLocal源码可知:使用ThreadLocal后,每个线程都维护着一个Map,而Map里存着Entry对象;key为ThreadLocal对象,值为ThreadLocal 的set方法设置的值(即我们保存在ThreadLocal里的值),这中结构意味着在一个线程里同一个ThreadLocal对象只能设置一个值,因为key不可重复;而Map里可存入多个Entry,但是通过不同的ThreadLocal来实现;

Map中存的Entry对象的key是个虚引用,因为虚引用在GC时会回收虚引用所指向的空间。使用虚引用是当我们线程中ThreadLocal对象的引用t1为null时,可以将ThreadLocal对象所占据的内存空间回收,避免内存泄漏,但还是有内存泄漏的危险,当ThreadLocal对象被回收后,key将为null,而原来根据key可找到的value将不能再被访问到,因此在使用ThreadLocal时千万千万要注意当使用完之后一定一定要调用remove() 方法将值移除。
具体的使用如下

import java.util.concurrent.TimeUnit;

public class ThreadLocal {
	//volatile static Person p = new Person();
	static ThreadLocal<Person> tl = new ThreadLocal<>();
	
	public static void main(String[] args) {
				
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println(tl.get());
		}).start();
		
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			tl.set(new Person());
		}).start();
	}
	
	static class Person {
		String name = "zhangsan";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值