ThreadLocal
继承实现关系
public class ThreadLocal extends Object
此类提供线程局部变量。 这些变量不同于 它们的正常对应物在于每个线程访问一个(通过其 get或者 set方法)有自己的,独立初始化的 变量的副本。 ThreadLocal实例通常是私有的 希望将状态与线程相关联的类中的静态字段(例如, 用户 ID 或交易 ID)。
只要线程是活的并且实例是可访问的,每个线程都暗中引用其线程本地变量的副本:线程消失后,其线程本地实例的所有副本都受到垃圾收集的约束(除非存在对这些副本的其他引用)。
方法
代码案例
import java.util.concurrent.TimeUnit;
class Person{
volatile String name="张三";
public Person(){
}
}
public class ThreadLocalDemo {
static ThreadLocal<Person>tl= new ThreadLocal<>();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
System.out.println(tl.get().name);
}).start();
}
}
一个线程修改name,但是对于另一个线程依然是不可见的,即每个线程操做的都是一个副本;
代码对比----->>
import java.util.concurrent.TimeUnit;
class Person{
volatile String name="张三";
public Person(){
}
}
public class ThreadLocalDemo {
/* static ThreadLocal<Person>tl= new ThreadLocal<>();*/
static Person tl= new Person();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.name);
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.name="李四";
}).start();
}
}
图解ThreadLocal原理------->>>>>
对比结果可以发现ThreadLocal类的作用-----实现本地变量的副本!