美文网首页
2020-04-05 ThreadLocal一探究竟

2020-04-05 ThreadLocal一探究竟

作者: 捕风的逍遥侯 | 来源:发表于2020-04-05 10:05 被阅读0次

package hxy.bytecode.thread.threadlocal;

public class ThreadLocalDemo {
    static class ThreadA implements Runnable {
        private ThreadLocal<String> threadLocal;

        public ThreadA(ThreadLocal<String> threadLocal) {
            this.threadLocal = threadLocal;
        }

        @Override
        public void run() {
            threadLocal.set("A");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


            System.out.println("ThreadA " + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());
        }
    }

    static class ThreadB implements Runnable {
        private ThreadLocal<String> threadLocal;

        public ThreadB(ThreadLocal<String> threadLocal) {
            this.threadLocal = threadLocal;
        }

        @Override
        public void run() {
            threadLocal.set("B");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("ThreadB " + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());
        }
    }

    public static void main(String[] args) {
        ThreadLocal<String> threadLocal = new ThreadLocal<>();
        threadLocal.set("测试");
//        上面新建了一个实例,下面传入多个线程,但是每个线程都复制了一个副本
        new Thread(new ThreadA(threadLocal)).start();
        new Thread(new ThreadB(threadLocal)).start();
        new Thread(new ThreadB(threadLocal)).start();

        System.out.println(Thread.currentThread().getName() + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());

    }

}

上面代码可以看出来,所有线程的对象应该都是使用了main方法新建的ThreadLocal的实例,但是传入到各个线程之后竟然全部不一样了。相当于每个线程都拥有了实例的副本,且各不相关,特殊之处就在本来就是一个对象,但是赋值到各个线程之后,竟然不是原来的。从下面打印的hashCode发现,各个线程接受的实例确实是main方法创建的同一个,但是为啥效果却不一样了。

image.png

进入ThreadLocal的set方法一探究竟。

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

    }

从上面可以看出来端倪了。系统维护了个全局变量的map,可以依据线程放对象线程的map值,然后再依据线程去取出该线程的map对象就好了。

相关文章

  • 2020-04-05 ThreadLocal一探究竟

    上面代码可以看出来,所有线程的对象应该都是使用了main方法新建的ThreadLocal的实例,但是传入到各个线程...

  • Java ThreadLocal 实现原理

    ThreadLocal 线程本地变量,算是Java开发中比较常用的API了,今天我们来一探究竟 使用场景 Thre...

  • Java8 ThreadLocal 源码解析

    前言 ThreadLocal ,像是一个神秘的黑衣人,令人望而生畏。唯有下定决心,一探究竟,方能解开他神秘的面纱、...

  • (小仙版)三生三世枕上书同人续写(二十)

    (二十)一探究竟 (坐着的话:虽然题目是一探究竟,但今天实在探不出什么究竟来了,好累,没断更已是最大的努力了。) ...

  • ThreadLocal 到底是什么?我们来一探究竟

    一、前言 对一个事务的认知是一个递进的过程。在了解ThreadLocal时,需要注意以下几点: 什么是Thread...

  • 一探究竟

    早晨突然醒来,看看时间五点多,窗外已然天色大亮,鸟声啾啾。再也睡不着,那就去散步罢。 走下楼去,微风有点儿凉意,小...

  • 《一探究竟》

    《一探究竟》 我把“孤独”绑缚在羸弱的腰上,没命价奔向深夜,我的梦也变得弯弯曲曲起来…… 昏黄的路...

  • “仙女村”里看仙女🧚♀️

    据说文登有个“仙女村”,和伙伴们一探究竟。

  • 好想一探究竟……

    摄影:真念一思 / 配诗:庐阳第一怪 撕破云顶登琼台,放眼天宽胜大海。 月影淡出星河散,一点惆怅郁心怀。 ...

  • (二)一探究竟

    一夜在辗转反侧中度过。天亮了,婷刚睡着,儿子就爬到她身边,拍着她的脸,喊着妈妈,我饿了。我要吃饭饭。 婷爬起来,对...

网友评论

      本文标题:2020-04-05 ThreadLocal一探究竟

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