ThreadLocal的作用

一、作用

为共享变量在每个线程中创建一个副本,每个线程可以访问自己内部的副本变量

二、代码简单理解

2.1、代码片1

public class Demo1 {
    static ThreadLocal threadLocal = new ThreadLocal<>();
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            System.out.println(threadLocal.get());
            threadLocal.set(0);
            System.out.println(threadLocal.get());
        });
        Thread t2 = new Thread(()->{
            System.out.println(threadLocal.get());
            threadLocal.set(1);
            System.out.println(threadLocal.get());
        });
        t1.start();
        t1.join();
        t2.start();
    }
}

 输出:

ThreadLocal的作用_第1张图片

t1线程开始执行,刚开始值为null,但是执行t1.join的时候等待线程1执行完毕,然后线程2开始执行,执行线程二中get ThreadLocal的值其实也是null,所以这两个线程中的ThreadLocal是隔离的.

2.2、代码片2

public class Demo2 {
    public static Integer num = 0;
    public static void main(String[] args) {
        Thread[] threads = new Thread[5];
        for(int i = 0;i{
                num+=5;
                System.out.println(Thread.currentThread().getName()+":"+num);
            },"Thread-"+i);
        }
        for(int i = 0;i

ThreadLocal的作用_第2张图片

全局变量的线程是相互影响的。

public class Demo3 {
    public static Integer num = 0;
    private static ThreadLocal threadLocal = new ThreadLocal(){
        //如果想在set之前调用get()方法就需要对initialValue方法进行重写
        @Override
        protected Integer initialValue(){
            return 0;
        }
    };
    public static void main(String[] args) {
        Thread[] threads = new Thread[5];
        for(int i = 0;i{
//                num+=5;
                int x = threadLocal.get().intValue();
                x+=5;
                threadLocal.set(x);
                System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
            },"Thread-"+i);
        }
        for(int i = 0;i

 输出:

ThreadLocal的作用_第3张图片

比较常用的是set(),get()和 remove()三种方法,其中remove()的作用是清楚当前线程的Threadlocal值,因为在线程池中线程并没有销毁就给其他请求使用了,这个ThreadLocal是前世的值,好的编程习惯就是remove()一下,用try{}finally即可。

 三、实现原理

3.1、get()方法

ThreadLocal的作用_第4张图片

ThreadLocal的作用_第5张图片

是一个ThreadLocalMap,是一个map,有key、value

ThreadLocal只是一个key,不截图了,看视频吧:https://www.bilibili.com/video/av82079309

这里还有个比较有意思的是Entry是弱引用的:

ThreadLocal的作用_第6张图片

 ThreadLocal的作用_第7张图片

你可能感兴趣的:(Java)