如何认识和理解ThreadLocal

 时间:2026-02-18 05:25:24

1、认识ThreadLocal类,首先看下这个类的常用方法

getMap和createMap方法,createMap里创建了一个ThreadLocalMap实例,并被线程Thread t所强引用,也就是说ThreadLocalMap的生命周期跟Thread一样长,如果线程没有销毁,ThreadLocalMap实例也不会被回收

如何认识和理解ThreadLocal

2、void set(T value)方法,map.set(this, value),是以ThreadLocal对象为key存储了value值,第一次set,则会调用createMap方法创建ThreadLocalMap。set内部调用的set方法有优化清除的操作

如何认识和理解ThreadLocal

3、T get()方法,map.getEntry(this)可以看出,是通过ThreadLocal作为key来找到之前set进去的value对象

如何认识和理解ThreadLocal

4、void remove()方法,是jdk1.5开始添加的,将当前线程局部变量的值删除,是为了快速释放内存,不是必须调用的,因为线程结束后会自动回收线程局部变量

如何认识和理解ThreadLocal

5、看ThreadLocal的源码可以看到,创建ThreadLocalMap的时候new Entry对象出来,这个Entry实际是继承了WeakReference类,这就表示在持有ThreadLocal对象实例的时候,是弱引用关系,这个是为了使ThreadLocal的回收不受ThreadLocalMap影响,从而在ThreadLocal被回收之后,对应的value在下一次ThreadLocalMap调用set,get,remove的时候会被清除

如何认识和理解ThreadLocal

6、最后给出一个使用ThreadLocal的例子代码

/**

 * 测试线程局部变量

 * Created by shaowei on 2017/8/15.

 */

public class TestThreadLocal {

    private static ThreadLocal<Integer> threadLocal

            = new ThreadLocal<Integer>() {

        public Integer initialValue(){

            return 0;

        }

    };

    public int getNextNum(){

        threadLocal.set(threadLocal.get()+1);

        return threadLocal.get();

    }

    public static void main(String[] args){

        TestThreadLocal sn = new TestThreadLocal();

        new TestThread(sn).start();

        new TestThread(sn).start();

        new TestThread(sn).start();

    }

    private static class TestThread extends Thread {

        private TestThreadLocal tl;

        public TestThread(TestThreadLocal tl){

            this.tl = tl;

        }

        public void run(){

            for(int i=0;i<5;i++){

                System.out.println("Thread["+Thread.currentThread().getName()

                        +"]tl["+tl.getNextNum()+"]");

            }

        }

    }

}

7、运行示例代码之后,打印结果可以看出,多个线程递增的序列数字没有混乱,说明存储在线程局部变量中,确实是解决了多线程并发冲突。

如何认识和理解ThreadLocal

  • 戴尔/dell服务器r820详细介绍
  • 怎样在Ubuntu 14.04下安装RT3070无线网卡驱动
  • 微星主板如何在BIOS中开启Intel VT-x虚拟化支持
  • OpenWrt路由器 怎样使用虚拟机助手增强性能?
  • 机械硬盘的读写速度
  • 热门搜索
    如何剪辑音乐 便秘肚子胀怎么办 美国旅游胜地 乌镇在哪里 穗是哪里 郑州旅游地图 李世民是哪里人 泉立方洗衣片怎么样 蝴蝶的家在哪里 如何去水垢