Java面试: ThreadLocal 原理和使用场景

本文深入探讨了Java中的ThreadLocal机制,阐述了其如何实现线程局部变量,确保线程间数据隔离。通过示例代码展示了ThreadLocal在解决多线程数据共享问题上的优势,并分析了ThreadLocal的源码,揭示了其实现细节。此外,文章还提及ThreadLocal在服务层处理事务时保存Connection对象的应用。
摘要由CSDN通过智能技术生成

📖前言

今天博主将为大家分享Java(面试必备):面试中的 ThreadLocal 原理和使用场景,不喜勿喷,如有异议欢迎讨论!

相信大家在面试中经常被问过 ThreadLocal 的原理和用法,虽然一直知道这个东西的存在但是一直没有好好的研究一下原理,没有自己的知识体系。今天安利一波有待提高


🚀ThreadLocal 是什么

ThreadLocalJDK java.lang 包中的一个用来实现相同线程数据共享不同的线程数据隔离的一个工具。 我们来看下 JDK 源码中是如何解释的:翻译后

ThreadLocal 这个类提供线程局部变量,这些变量与其他正常的变量的不同之处在于,每一个访问该变量的线程在其内部都有一个独立的初始化的变量副本;ThreadLocal 实例变量通常采用 private static 在类中修饰。

只要 ThreadLocal 的变量能被访问,并且线程存活,那每个线程都会持有 ThreadLocal 变量的副本。当一个线程结束时,它所持有的所有 ThreadLocal 相对的实例副本都可被回收。

一句话说就是 ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用(相同线程数据共享),也就是变量在线程间隔离(不同的线程数据隔离)而在方法或类间共享的场景。


ThreadLocal 使用
 package com.test;

import java.util.concurrent.CountDownLatch;

/**
 * 
 * @Description: 我的测试类
 * @ClassName: MyDemo.java
 * @author ChenYongJia
 * @Date 2019年4月17日 晚上23:25
 * @Email chen87647213@163.com
 */
public class MyDemo {
   

	private String string;

	private String getString() {
   
		return string;
	}

	private void setString(String string) {
   
		this.string = string;
	}

	public static void main(String[] args) {
   
		int threads = 9;
		MyDemo demo = new MyDemo();
		CountDownLatch countDownLatch = new CountDownLatch(threads);
		for (int i = 0; i < threads; i++) {
   
			Thread thread = new Thread(() -> {
   
				demo.setString(Thread.currentThread().getName());
				System.out.println("demo.getString()================>" + demo.getString());
				countDownLatch.countDown();
			}, "执行线程 - " + i);
			thread.start();
		}

	}

}

控制台输出

demo.getString()================>执行线程 - 0
demo.getString()================>执行线程 - 1
demo.getString()================>执行线程 - 2
demo.getString()==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值