深入理解----ThreadLocal的工作原理
来源:互联网 发布:风险矩阵应用 编辑:程序博客网 时间:2024/06/07 02:19
ThreadLocal 是什么?
ThreadLocal是一个线程内部数据的存储类,通过它可以在指定的线程中存储数据,数据存储之后,只有在指定线程中可以获得到存储的数据,对于其他线程来说则无法获取到数据。
下面通过一个例子来了解ThreadLocal对象:
public class ThreadLocalTest {private static ThreadLocal<Integer> t = new ThreadLocal<Integer>();public static void main(String[] args) {t.set(8);System.out.println(Thread.currentThread().getName()+t.get());new Thread(){@Overridepublic void run(){t.set(5);System.out.println(Thread.currentThread().getName()+t.get());}}.start();new Thread(){ @Overridepublic void run(){t.set(7);System.out.println(Thread.currentThread().getName()+t.get());}}.start();}}
结果如下:
由结果可以看出:主线程,线程0,线程1,虽然访问的是同一个对象的值,但是每个线程获得的值是不一样的。这是因为不同的线程访问的是同一个ThreadLocal对象的get()方法,ThreadLocal内部会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查出对应的value值,不同线程中数组不同。所以可以在不同线程中有不同的副本,而且互不干扰。
public class ThreadLocal<T> {}主要有4个方法,主要理解set()和get()方法就可以理解它的工作原理了下面看下set()的源码:
public void set(T value) { Thread currentThread = Thread.currentThread(); Values values = values(currentThread); if (values == null) { values = initializeValues(currentThread); } values.put(this, value); }我们可以知道set()是通过values来取得当前线程的ThreadLocal的值。
get()的源码如下:
public T get() { // Optimized for the fast path. Thread currentThread = Thread.currentThread(); Values values = values(currentThread); if (values != null) { Object[] table = values.table; int index = hash & values.mask; if (this.reference == table[index]) { return (T) table[index + 1]; } } else { values = initializeValues(currentThread); } return (T) values.getAfterMiss(this); }
我们可以看出get()方法是取出当前线程的ThreadLocal的值,如果为空就返回null
0 0
- 深入理解----ThreadLocal的工作原理
- 理解Android中ThreadLocal的工作原理
- ThreadLocal的工作原理
- 深入理解Java的ThreadLocal
- ThreadLocal类的工作原理
- 深入理解IIS工作原理
- 深入理解IIS工作原理
- 深入理解yum工作原理
- Ajax工作原理深入理解
- 深入理解Mock工作原理
- Ajax工作原理深入理解
- 深入理解yum工作原理
- Android中ThreadLocal的工作原理
- Java Thread&Concurrency(10): 深入理解ThreadLocal及其实现原理
- 深入理解ThreadLocal
- ThreadLocal深入理解
- ThreadLocal深入理解2
- ThreadLocal深入理解
- java笔记-函数参数传值
- Find the Duplicate Number
- 1.shell工具sed中的正则表达式
- TCP 协议中MSS的理解
- QT5下SQLite的增删改查示例代码
- 深入理解----ThreadLocal的工作原理
- Hibernate学习笔记之ORM实体间关系“OneToOne”详解
- 九度OJ 1123 采药 0/1背包问题
- Servlet+JSP实现人员新增
- 安卓实现右滑返回效果
- 【NOIP2012借教室】(线段树区间操作)
- float 转定点计算加法和乘法
- php date函数各参数含义
- OCR文字识别可以帮你节省纸