ThreadLocal

来源:互联网 发布:java 类的定义 编辑:程序博客网 时间:2024/05/22 11:40

threadlocal是线程本地变量,用法:

ThreadLocal<String> stringLocal = new ThreadLocal();stringLocal.set("hello");  //设置值stringLocal.get();   //获取值stringLocal.remove();  //删除

简单理解,每个threadlocal都有一个Map(这个map其实是当前线程的成员变量threadLocals),key为当前变量threadlocal,value为设置的值。示例:

    public static void main(String[] args) throws Exception{        final ThreadLocal<String> strLocal = new ThreadLocal<String>();        strLocal.set("hello");        System.out.println(strLocal.get());        Thread thread = new Thread(){            public void run(){                strLocal.set("world");                //在下一行断点,发现thread的threadlocals的size为1,key为strLocal,值为"world"                System.out.println("thread:" + strLocal.get());            }        };        thread.start();        thread.join();        Thread current = Thread.currentThread();        //在下一行断点,发现current的threadlocals的size为1,key为strLocal,值为"world"        System.out.println(strLocal.get());    }

当strLocal调用set时,获取当前线程的成员变量threadlocals,存入一对键值对,key为strLocal,value为set的值。虽然是strLocal调用set方法,但strLocal自己并没有一个map对象,我们断点发现,它只有一个变量threadLocalHashCode,用于在map中查找时使用。

看了很多博客,说threadlocals自己有一个map为每一个线程保存一个副本,实际并非如此,副本实际上保存在线程自己的成员变量中,而threadlocal只是提供了一个get的条件而已:当前线程已知(可以获取存线程本地变量的map),要获取的threadlocal变量(map中的key),然后内部调用map.get(key)就取到本地副本了。


延伸:关于ThreadLocal可能产生内存泄漏 
0 0
原创粉丝点击