深入理解----ThreadLocal的工作原理

ThreadLocal 是什么?

   ThreadLocal是一个线程内部数据的存储类,通过它可以在指定的线程中存储数据,数据存储之后,只有在指定线程中可以获得到存储的数据,对于其他线程来说则无法获取到数据。


下面通过一个例子来了解ThreadLocal对象:

public class ThreadLocalTest {
	private static ThreadLocal<Integer> t  = new ThreadLocal<Integer>();
	
	public static void main(String[] args) {
		t.set(8);
		System.out.println(Thread.currentThread().getName()+t.get());
		
		new Thread(){
		@Override
		public void run(){
			t.set(5);
			System.out.println(Thread.currentThread().getName()+t.get());
			}		
				}.start();
				
		new Thread(){
		   @Override
			public void run(){
				t.set(7);
				System.out.println(Thread.currentThread().getName()+t.get());
				}		
					}.start();
					
					
	}
	
}

结果如下:

由结果可以看出:主线程,线程0,线程1,虽然访问的是同一个对象的值,但是每个线程获得的值是不一样的。这是因为不同的线程访问的是同一个ThreadLocal对象的get()方法,ThreadLocal内部会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查出对应的value值,不同线程中数组不同。所以可以在不同线程中有不同的副本,而且互不干扰。


public class ThreadLocal<T> {}
主要有4个方法,主要理解set()和get()方法就可以理解它的工作原理了

下面看下set()的源码:
 public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value);
    }
我们可以知道set()是通过values来取得当前线程的ThreadLocal的值。

get()的源码如下:
 public T get() {
        // Optimized for the fast path.
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values != null) {
            Object[] table = values.table;
            int index = hash & values.mask;
            if (this.reference == table[index]) {
                return (T) table[index + 1];
            }
        } else {
            values = initializeValues(currentThread);
        }

        return (T) values.getAfterMiss(this);
    }

我们可以看出get()方法是取出当前线程的ThreadLocal的值,如果为空就返回null










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值