1. 概述
- ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
- ThreadLocal的作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。
- 线程并发:在多线程并发的场景下。
- 传递数据:可以通过ThreadLocal在同一线程,不同组件中传递公共变量。保存每个线程绑定的数据,在需要的地方可以直接获取,避免参数直接传递带来的代码耦合问题。
- 线程隔离:每个线程的变量都是独立的,不会相互影响。各线程之间的数据相互隔离却又具备并发性,避免同步方式带来的性能损失。
- 在项目中需要进行数据传递和线程隔离的场景,可以用ThreadLocal来解决。
2. 案例分析1
package com.java.threadlocal;
public class ThreadlLocalTest1 {
private String content;
private String getContent() {
return content;
}
private void setContent(String content) {
this.content = content;
}
public static void main(String[] args) {
ThreadlLocalTest1 t1 = new ThreadlLocalTest1();
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
t1.setContent(Thread.currentThread().getName() + "");
System.out.println(Thread.currentThread().getName() + "的数据为:" + t1.getContent());
}
});
thread.start();
}
}
}
Thread-0的数据为:Thread-1
Thread-4的数据为:Thread-4
Thread-3的数据为:Thread-3
Thread-1的数据为:Thread-1
Thread-2的数据为:Thread-2
2.1 ThreadLocal解决线程安全问题
package com.java.threadlocal;
public class ThreadLocalTest4 {
private static ThreadLocal<String> tl = new ThreadLocal<String>();
private String content;
private String getContent() {
return tl.get();
}
private void setContent(String content) {
tl.set(content);
}
public static void main(String[] args) {
ThreadLocalTest4 t4 = new ThreadLocalTest4();
for (int i = 0; i <