java ThreadLocal详解
2017-10-28 15:05
267 查看
ThreadLocal的作用:ThreadLocal修饰的变量一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的了可见范围限制在同一线程内。
下面我们老看看小案例:
输出结果:
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>,泛型的哦
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.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); }好好学
4000
习!天天向上!
下面我们老看看小案例:
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); }好好学
4000
习!天天向上!
相关文章推荐
- java ThreadLocal 使用详解
- java ThreadLocal源码详解及用法
- Java中Thread的使用、死锁以及生产者消费者问题详解
- Java Thread.join()详解
- Java Thread.join()详解
- Java Thread.join()详解
- Java基础 之ThreadLocal
- java线程安全的ThreadLocal
- java ThreadLocal 自己的一些见解
- Java ThreadLocal的使用
- java之Thread线程相关yield()、sleep()、wait()、join()、run和start区别详解
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- Java ThreadLocal 线程安全问题解决方案
- Java 多线程:InheritableThreadLocal 实现原理
- 深入学习java并发编程:ThreadLocal<T>实现
- Java多线程Thread VS Runnable详解
- Java Thread.join()详解
- Java Thread(线程)案例详解sleep和wait的区别
- Java ThreadLocal的使用
- Java Thread多线程详解及用法解析