java ThreadLocal详解

ThreadLocal的作用:ThreadLocal修饰的变量一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的了可见范围限制在同一线程内。

下面我们老看看小案例:

import java.util.concurrent.atomic.AtomicInteger;

public class Solution {
	public static void main(String[] args) {
		TestDemo d1 = new TestDemo();
		Thread t1 = new Thread(d1);
		Thread t2 = new Thread(d1);
		Thread t3 = new Thread(d1);
		Thread t4 = new Thread(d1);
		Thread t5 = new Thread(d1);
		Thread t6 = new Thread(d1);
		t3.start();
		t1.start();
		t2.start();
		t4.start();
		t6.start();
		t5.start();
	}
}

class TestDemo implements Runnable {
	ThreadLocal<Integer> a = new  ThreadLocal<Integer>() {
		protected Integer initialValue() {
			return 0;
		}
	};
	@Override
	public void run() {
		a.set(a.get()+1);
		System.out.println(Thread.currentThread().getName()+","+a.get());
	}
	
}

输出结果:

Thread-1,1
Thread-4,1
Thread-3,1
Thread-5,1
Thread-0,1
Thread-2,1

可以看到,每个线程对变量的操控都是独立的。说一下ThreadLocal的使用方式把,初始化的时候,你必须重写它的initialValue()方法(不然get到的是null),获取值时调用get(),设置值时用set().


到接下来我们来看看java 中的ThreadLocal的源码吧,看看他到底是怎么实现的:

类的定义是:public class ThreadLocal<T>,泛型的哦

    protected T initialValue() {
        return null;
    }
这个函数的作用是:初始化对象的值

 public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }
这个函数是从对ThreadLocal取值的,中间涉及到一个特殊的map,是通过getMao(t)获取的
ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
可以看到这个map是调用Thread类的ThreadLocals产生的,继续追代码

ThreadLocal.ThreadLocalMap threadLocals = null;
可以看到ThreadLocal中有一个静态内部类ThreadLocalMap;
其实从get()方法中你就可以看出,该map是根据每个线程存一个值来保存变量副本的。不信的话,你可以看看ThreadLocal的get()方法,如下所述:

    public void set(T value) {
        Thread t = Thread.currentThread();

ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
好好学习!天天向上!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值