Java进阶 ——— Java多线程(四)之多线程局部变量TreadLocal

本文详细介绍了Java中的ThreadLocal,它提供了线程局部变量,确保每个线程拥有独立的副本,避免了并发访问的线程安全问题。通过示例和源码分析,解释了ThreadLocal如何在每个线程中创建和存储变量副本,以及get、set和remove方法的工作机制。总结了ThreadLocal的关键应用场景和注意事项。
摘要由CSDN通过智能技术生成

在了解ThreadLocal之前,一定要确定一个概念:ThreadLocal不是用来解决共享对象的多线程访问问题的
那么ThreadLocal在多线程的作用是什么呢?从下面几个方面来了解

ThreadLocal的作用

ThreadLocal可以理解为:线程局部变量, 是每一个线程所单独持有的。其他线程不能对其进行访问, 通常是类中的 private static 字段,是对该字段初始值的一个拷贝,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联,

在并发编程的时候,成员变量如果不做任何处理其实是线程不安全的,各个线程都在操作同一个变量,显然是不行的,并且我们也知道volatile这个关键字也是不能保证线程安全的。当然我们可以使用synchorinized 关键字来为此变量加锁,进行同步处理,从而限制只能有一个线程来使用此变量,但是加锁会大大影响程序执行效率,此外我们还可以使用ThreadLocal来解决对某一个变量的访问冲突问题。

当使用ThreadLocal维护变量的时候 为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。

深入了解ThreadLocal使用

先不去分析源码,仅仅写个例子,根据例子学习ThreadLocal的简单使用。

public class ThreadTest {
  //定义一个全局ThreadLocal
	public static ThreadLocal<String> locals= new ThreadLocal<String>();
  
  //开启三个线程
	public void threadLocalTest(){
		ThreadLocalTest test1 = new ThreadLocalTest("AA");
		ThreadLocalTest test2 = new ThreadLocalTest("BB");
		ThreadLocalTest test3 = new ThreadLocalTest("CC");
		test1.start();
		test2.start();
		test3.start();
	}
}

在线程里往ThreadLocal塞值,再打印出

public class ThreadLocalTest extends Thread {

	private int a = 5;

	public ThreadLocalTest(String name) {
		super(name);
	}

	@Override
	public void run() {
		super.run();
		try {
			for (int i = 0; i < 5; i++) {
				a += 1;
				ThreadTest.locals.set(a + "");
				Log.e(this.getName(), "value =&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值