ThreadLocal使用及其实现原理

本文深入探讨了ThreadLocal的工作原理及其在多线程环境中的应用,通过实例演示如何避免线程安全问题,确保每个线程拥有独立的数据副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

threadLocal作用

  • 当只有一个共享资源时,创建多个子线程,在没有处理的情况下,这些子线程肯定共同操作这一共享资源中的共享数据,在容易造成线程安全问题的同时,也会不符合一些开发情况的要求。
  • 所以threadLocal的作用就是,将在共享资源类中运用ThreadLocal建立各线程自己独享的序列。是原本的共享资源,在每个线程中独立操作。

原理

threadLocal使用的是map键值对,threadLocal通过map集合,map(“当前线程”,值)将值与当前线程绑定,达到线程拥有各自独立的序列。

/*
 * threadLocal通过map集合,map("当前线程",值)
 */
public class ThreadLocalTest {
	public static void main(String[] args) {
		Res res = new Res();
		ThreadLocalDemo t1 = new ThreadLocalDemo(res);
		
		ThreadLocalDemo t2 = new ThreadLocalDemo(res);
		ThreadLocalDemo t3 = new ThreadLocalDemo(res);
		t1.start();
		t2.start();
		t3.start();
	}
}

class Res{
	//private int count = 0;
	/*
	 * 设置线程本地变量
	 */
	private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
		protected Integer initialValue() {
			return 0 ;
		};
	};
	public Integer getNum() {
		Integer count = this.count.get() +1;
		this.count.set(count);
		return count;
	}

}

class ThreadLocalDemo extends Thread{
	private Res res;
	public ThreadLocalDemo(Res res) {
		this.res = res;
	}
	@Override
	public void run() {
		for (int i = 0; i <3; i++) {
			System.out.println(getName()+"---i:"+i+"--count"+res.getNum());
		}
		
	}
}

res类中,原本使用普通int型定义数据,不能达到要求,故使用以上代码中的

	private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
		protected Integer initialValue() {
			return 0 ;
		};
	};

给数据,定义一个初始值。此时的count为一个threadLocal的对象,故在下列代码框中重新定义count变量,且用count对象get方法,获取value值。

public Integer getNum() {
		Integer count = this.count.get() +1;
		this.count.set(count);
		return count;
	}
  • 以下试运行结果,每一个线程的count值,都为1,2,3;各线程独立的序列
Thread-2---i:0--count:1
Thread-1---i:0--count:1
Thread-0---i:0--count:1
Thread-1---i:1--count:2
Thread-2---i:1--count:2
Thread-2---i:2--count:3
Thread-1---i:2--count:3
Thread-0---i:1--count:2
Thread-0---i:2--count:3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值