java多线程系列17 ThreadLocal

ThreadLocal 叫做 线程局部变量

在详细解释之前 先看一段代码

public class ThreadLocalTest {

	private static ThreadLocal<Integer> intThreadLocal = new ThreadLocal<Integer>();

	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					int data = new Random().nextInt(10000);
					System.out.println(Thread.currentThread().getName() + " add data :" + data);
					intThreadLocal.set(data);
					System.out.println(Thread.currentThread().getName() + " " + intThreadLocal.get());
				}
			}).start();
		}
	}

  运行结果如下

     

可以看到每个Thread都是自己设置进去的那个值,相互不影响

 

ThreadLocal有两个比较重要的方法

get() set()

下面我们细看一下 get()

public T get() {
      //获取当前线程
        Thread t = Thread.currentThread();
      //获取到当前线程的ThreadLocalMap对象,每个线程都有一个
        ThreadLocalMap map = getMap(t);
        if (map != null) {  //不为空 就把ThreadLocal作为key 获取对应的值
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue(); //为空 就初始化
    }

  

 下面我们细看一下 set()

  

//map不为空 将值设置进线程的 ThreadLocal中。为空就new一个
  public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

  

 总结:

1 ThreadLocal 不是用来解决共享对象的多线程访问问题的,

一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象(新new出来的对象),其他线程是不需要访问的,也访问不到的。

倘若都设置的同一个对象 依然会有线程安全问题。

2  若多个线程之间需要共享资源,以达到线程间的通信时,就使用同步机制;若仅仅需要隔离多线程之间的关系资源,则可以使用ThreadLocal

原文地址:https://www.cnblogs.com/javabigdata/p/7061069.html