`
信善知圣
  • 浏览: 4185 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Thread.currentThread()与ThreadLocal

阅读更多
-- 最近再探Spring,深入研究了一下Spring的Introduce Advice。其中涉及到了关于ThreadLocal的一些内容,回顾了一下,这里做个记录。

-- Java DOC说ThreadLocal存储了一个线程的局部变量,内部究竟是怎样的。具体如下:

-- Thread中维护了一个ThreadLocal.ThreadLocalMap的变量。
  
ThreadLocal.ThreadLocalMap threadLocals = null;

  
-- 当我们调用ThreadLocal的set方法的时候,实际上是往Thread.currentThread()也就是当前线程的ThreadLocalMap变量中添加数据。
  
        public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }
   


-- 由此可见,一个Thread可以维护多个ThreadLocal

-- 再看ThreadLocal.ThreadLocalMap(ThreadLocalMap是ThreadLocal的静态内部类,为了方便,下面简写为ThreadLocalMap)
   ThreadLocalMap是不是像他名字所写的那样使用了一个Map来储存一个Thread的局部变量呢?答案是否定的。
  
private Entry[] table;

   实际上它用的是一个ThreadLocalMap.Entry数组。这个数组的初始容量为16.
  
private static final int INITIAL_CAPACITY = 16;


-- Entry是ThreadLocalMap静态内部类。下面简写为Entry。

-- 那么又是如何往Entry[ ]中添加数据呢?
   private void set(ThreadLocal key, Object value) {

        Entry[] tab = table;
        int len = tab.length;
        int i = key.threadLocalHashCode & (len-1);

        for (Entry e = tab[i];
            e != null;
            e = tab[i = nextIndex(i, len)]) {

            ThreadLocal k = e.get();

            if (k == key) {
                e.value = value;
                return;
            }

            if (k == null) {
                replaceStaleEntry(key, value, i);
                return;
            }
        }

        tab[i] = new Entry(key, value);
        int sz = ++size;
        if (!cleanSomeSlots(i, sz) && sz >= threshold)
            rehash();
    }


    -- 这里使用了ThreadLocal的threadLocalHashCode与16进制的F做与操作的结果作为索引来向Entry数组添加数据。上面判断是否已经使用当前TheadLocal添加了数据,下面对数组越界做处理。具体怎么处理的,时间所限没有深究。

-- 至于Entry本质上就是一个没有存取器的Java Bean。它有两个属性:
   ThreadLocal类型的key,
   Object类型的Value
分享到:
评论

相关推荐

    入研究java.lang.ThreadLocal类.docx

    入研究java.lang.ThreadLocal类.docx

    正确理解ThreadLocal.pdf

    正确理解ThreadLocal.pdf

    ThreadLocal.pdf

    ThreadLocal

    Quartz-ThreadLocal.rar

    本地学习练习demo的eclipse工作空间:主要包括多线程的相关demo以及quartz调度的简单实现和其他java基础的demo练习

    ThreadLocal详解.md

    学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!

    使用Java ThreadLocal.docx

    我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用...

    jKill#basic-notes#ThreadLocal实现原理1

    通过ThreadLocal对象定位到线程:Thread.currentThread()通过ThreadLocal对象拿到所在的ThreadLocalMap: T

    ThreadLocal整理.docx

    解析源码内容,包括threadlocalmap中怎么解决hash冲突,以及set时得各种场景,还有set时什么条件会触发扩容机制,并且说明在过期桶中为什么要清除这些数据信息。

    JAVA并发-自问自答学ThreadLocal.pdf

    JAVA并发-自问自答学ThreadLocal

    threadlocal源码.jpg

    threadlocal源码解析

    threadlocal.rar

    《ThreadLocal究竟是个啥?》案例代码,讲述了ThreadLocal的概念使用,解答了ThreadLocal在父子线程中通信问题。

    线程锁+ThreadLocal.docx

    多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!线程锁主要用来给方法、代码块加锁

    ThreadLocal

    什么是ThreadLocal .

    Synchronized与ThreadLocal

    Synchronized与ThreadLocal

    8个案例详解教会你ThreadLocal.docx

    通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多...而使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。也就是说:将线程公有化变成线程私有化。

    ThreadLocal 用法详解.md

    ThreadLocal 用法详解.md

    ActiveMQ_Demo

    TextMessage msg = session.createTextMessage(Thread.currentThread().getName()+ "productor:我是大帅哥,我现在正在生产东西!,count:"+num); System.out.println(Thread.currentThread().getName()+ ...

    Java并发编实践之ThreadLocal变量.doc

    Java并发编实践之ThreadLocal变量.doc

    ThreadLocal详解及说明

    关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...

Global site tag (gtag.js) - Google Analytics