java ThreadLocal详解
来源:互联网 发布:js 遍历页面所有元素 编辑:程序博客网 时间:2024/05/18 02:42
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;}};@Overridepublic 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 0
- [Java]ThreadLocal详解
- Java并发:ThreadLocal详解
- Java ThreadLocal详解
- java ThreadLocal 使用详解
- 【Java 并发】详解 ThreadLocal
- java ThreadLocal详解
- JAVA多线程系列--ThreadLocal详解
- Java并发编程之ThreadLocal类详解
- java ThreadLocal源码详解及用法
- Java解读-ThreadLocal详解与应用
- Java并发编程之ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- ThreadLocal详解
- 我国将公布首个无人驾驶技术标准,特斯拉车祸再生 | 智驾周刊
- HTML 将导航页嵌套到<iframe>中
- JavaScript知识夯实系列-3.变量与数据类型
- 数值的整数次方(代码的完整性)
- JVM 之 逃逸分析和TLAB
- java ThreadLocal详解
- javascript事件简述和入门案例,js事件驱动机制;js 点击事件;js 焦点事件表单提交事件,键位弹起事件鼠标移入移除事件,
- [DP] Atcoder AGC013D. Piling Up
- 腾讯应用宝合作伙伴沙龙在京举办 分享精准高效分发
- HotSpot的G1收集器
- 一些问题
- 一步一步学java 1.2.1Java关键字
- java课程学习三:编程序题
- 获取iOS App 包名、版本号、设备信息、签名