今天博主将为大家分享Java(面试必备):面试中的 ThreadLocal
原理和使用场景,不喜勿喷,如有异议欢迎讨论!
相信大家在面试中经常被问过 ThreadLocal
的原理和用法,虽然一直知道这个东西的存在但是一直没有好好的研究一下原理,没有自己的知识体系。今天安利一波有待提高
ThreadLocal
是什么ThreadLocal
是 JDK 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 [email protected]
*/
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()==