ThreadLocal

作者: 尉昌达 | 来源:发表于2020-07-11 09:23 被阅读0次

    ThreadLocal,线程之间隔绝。

    public class ThreadLocal2 {
        //volatile static Person p = new Person();
        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());
            }).start();
        }
        
        static class Person {
            String name = "zhangsan";
        }
    }
    

    输出:

    null
    

    上面代码,在一个线程中设置 tl.set(new Person()),在另一个线程中tl.get()的是null。
    在ThreadLocal set方法里,

    public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }
    

    进入getMap

    ThreadLocalMap getMap(Thread t) {
            return t.threadLocals;
        }
    

    -- set的时候,是把值设置到了当前线程的map中,所以别的线程访问不到。

    • ThreadLocal有用在声明式事物中,保证同一个Connection。

    相关文章

      网友评论

        本文标题:ThreadLocal

        本文链接:https://www.haomeiwen.com/subject/zyubcktx.html