

8.ThreadLocal的应用及源码
source link: http://sunliangliang.com/?p=46
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

相信不少小伙伴都知道ThreadLocal
这个知识点,或者在面试中被问道过,
- ThreadLocal是什么?
- ThreadLocal的用法以及应用场景
- ThreadLocal源码角度分析
- ThreadLocal存在的问题以及解决方案
ThreadLocal
线程局部变量,又有人称线程本地副本,在多线程环境下,如果是共享的数据,我们可以使用volatile
,synchronized
,lock
等方式处理。- 如果是线程自己的变量副本,每个线程直接操作自己的本地副本即可。此时就可以使用
ThreadLocal
了
2.ThreadLocal的用法以及应用场景
public class ThreadLocalDemo {
public static void main(String[] args) {
Task task = new Task();
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
}
static class Task implements Runnable{
ThreadLocal<Integer> txId = new ThreadLocal<>();
@Override
public void run() {
txId.set((int)(Math.random()*10));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(txId.get());
}
}
}
- 每个线程使用ThreadLocal中自己的数据,
3.ThreadLocal源码解析
3.1.set方法
public void set(T value) {
Thread t = Thread.currentThread();
//获取到ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
//这里获取的线程`Thread`属性`threadLocals`
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
我们从线程Thread
类中找到了如下代码
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;
/*
* InheritableThreadLocal values pertaining to this thread. This map is
* maintained by the InheritableThreadLocal class.
*/
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
- 也就是说线程
Thread
类有一个ThreadLocalMap
的熟悉来维护ThreadLocal
,也就是说我们通过线程类的一个map来维护这个副本变量的。
3.2.get方法
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();
}
Recommend
-
116
ThreadLocal介绍java.lang.ThreadLocal<T> 类是Java提供的用来保存线程本地变量的机制。说道线程本地变量很容易和和线程栈帧里的本地变量表联系起来。不过ThreadLocal的最普遍的用途是避免线程安全问题和框架代码实现模板模式。说道线程安全又要温习...
-
54
-
52
线程封闭之 ThreadLocal 源码详解
-
67
这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的《开发艺术探索》,后来是在研究 ViewRootImpl 中又碰到一次,而且还发现 Android 中一个小彩蛋,就越发觉得这个东西很有趣,那么便借助主席...
-
30
目录 2.1ThreadLocal的类层级关系 2.2ThreadLocal的属性字段 2.6ThreadLocal-remove操作 3.0线性探测算法解决hash冲突 3.2ThreadLocalMap的常量介绍 3.4ThreadLocalM...
-
23
今天来看一下Thread和ThreadLocal类的源码。 一、Thread (1)首先看一下线程的构造方法,之后会说每种参数的用法,而所有的构造函数都会指向init方法 //空构造创建一个线程 Thread() //传入Runnable对象创...
-
10
简单扣一下ThreadLocal源码发布于 4 分钟前ThreadLocal内部定义了一个静态内部类ThreadLocalMap,这个Map的key就是当前的ThreadLo...
-
7
系列文章目录和关于我 一丶ThreadLocal结构
-
4
ThreadLocal源码解析及实战应用 精选 原创 作者:京东物流 闫鹏勃1 什么是ThreadLocal...
-
8
ThreadLocal底层源码解析 ThreadLocal:顾名思义的意思是本地线程或者局部线程的意思,其真正含义是希望多个线程之间拥有自己的局部变量,多个线程间拥有自己的私人变量,在多线程间不被共享,被线程单独享用,这就是T...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK