ThreadLocal原理解析

原理

ThreadLocal实际起作用的是ThreadLocal内部的ThreadLocalMap类,对于每一个Tread,都有一个ThreadLocalMap属性,从而实现线程隔离,然后set的时候就通过获取当前线程然后给他的ThreadLcoalMap属性添加值

public  
class Thread implements Runnable {
	ThreadLocal.ThreadLocalMap threadLocals = null;
}

ThreadLocalMap

static class ThreadLocalMap {  
  
    /**  
     * The entries in this hash map extend WeakReference, using     * its main ref field as the key (which is always a     * ThreadLocal object).  Note that null keys (i.e. entry.get()     * == null) mean that the key is no longer referenced, so the     * entry can be expunged from table.  Such entries are referred to     * as "stale entries" in the code that follows. */
     // Entry是节点,继承了WeakReferentce,定义了一个value
     static class Entry extends WeakReference<ThreadLocal<?>> { 
		  Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
		}
	    public void set(T value) {
			    // 获取当前线程
		        Thread t = Thread.currentThread();
				// 通过当前线程获取线程中维护的ThreadLocalMap对象
		        ThreadLocalMap map = getMap(t);
		        if (map != null) {
		            map.set(this, value);
		        } else {
		            createMap(t, value);
		        }
		    }
}

为何使用弱引用

因为ThreadLocalMap的key是Thread,如果像普通的key-value的定义,只要线程未销毁
就会一直存在,所以使用弱引用就可以在不存在强引用的时候就将这个销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值