官方描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是 private static 类型的,用于关联线程和线程上下文。
总结:
1、线程并发:在多线程并发场景下使用
2、传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量
3、线程隔离:每个线程的变量都是独立的,不会互相影响
基本使用
常用方法
使用案例
线程不隔离代码
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() {
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() {
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的数据