官方描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是 private static 类型的,用于关联线程和线程上下文。

总结:

1、线程并发:在多线程并发场景下使用

2、传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量

3、线程隔离:每个线程的变量都是独立的,不会互相影响

基本使用

常用方法

ThreadLocal详细解答(一)_多线程并发

使用案例

线程不隔离代码

package com.wustyq;

/**
* 需求:线程隔离
* 在多线程并发的场景下,每个线程中的变量都是相互独立的
* 线程A:设置(变量1) 获取(变量1)
* 线程B:设置(变量2) 获取(变量2)
**/

public class MyDemo01 {

//变量
private String content;

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public static void main(String[] args) {
MyDemo01 demo = new MyDemo01();

for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
demo.setContent(Thread.currentThread().getName() + "的数据");
System.out.println("----------------------------");
System.out.println(Thread.currentThread().getName() + "--->" + demo.getContent());
}
});

thread.setName("线程" + i);
thread.start();
}
}
}

运行效果:

----------------------------
----------------------------
线程1--->线程1的数据
线程0--->线程1的数据 ==> 数据错位
----------------------------
线程2--->线程2的数据
----------------------------
线程3--->线程3的数据
----------------------------
线程4--->线程4的数据

使用ThreadLocal的代码

package com.wustyq;

/**
* 需求:线程隔离
* 在多线程并发的场景下,每个线程中的变量都是相互独立的
* 线程A:设置(变量1) 获取(变量1)
* 线程B:设置(变量2) 获取(变量2)
* <p>
* ThreadLocal:
* 1、set(): 将变量绑定到当前线程中
* 2、get(): 获取当前线程绑定的变量
**/

public class MyDemo01 {
ThreadLocal<String> t1 = new ThreadLocal<>();

//变量
private String content;

public String getContent() {
String s = t1.get();
return s;
// return content;
}

public void setContent(String content) {
// this.content = content;
//变量content绑定到当前线程
t1.set(content);
}

public static void main(String[] args) {
MyDemo01 demo = new MyDemo01();

for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
demo.setContent(Thread.currentThread().getName() + "的数据");
System.out.println("----------------------------");
System.out.println(Thread.currentThread().getName() + "--->" + demo.getContent());
}
});

thread.setName("线程" + i);
thread.start();
}
}
}

运行结果展示

----------------------------
----------------------------
----------------------------
线程2--->线程2的数据
线程0--->线程0的数据
线程1--->线程1的数据
----------------------------
线程3--->线程3的数据
----------------------------
线程4--->线程4的数据