摘要:介绍以下是源码中对的官方解释,已经非常精炼了。简单例子其实源码里已经给出了使用的样例,这里就当自我熟悉一下。顾名思义,目的就是让可以访问的。而且可以通过重写方法任意改变的简单例子年月日主要源码可以参考这篇文章源码解读
ThreadLoal介绍
以下是JDK1.8源码中对ThreadLocal的官方解释,已经非常精炼了。
Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
白话一点就是每个thread在自己的生命周期内维护着一个本地变量,仅供自身上下文使用。
ThreadLocal 简单例子其实JDK源码里已经给出了使用的样例,这里就当自我熟悉一下。(这个例子主要是为了用下initialValue(),可以直接看第二个简单例子)
package cn.lw.thread; import java.util.UUID; /** * @author wanglei 2018年5月3日 */ public class ThreadLocalTest3 { public static void main(String[] args) { MyThread3 myThread = new MyThread3(); Thread t1 = new Thread(myThread, "t1"); Thread t2 = new Thread(myThread, "t2"); t1.start(); t2.start(); try { t1.join(); //等待t1终止 t2.join(); //等待t2终止 } catch (InterruptedException e) { e.printStackTrace(); } } } class MyThread3 implements Runnable { @Override public void run() { // 初始化当前thread的local-value,仅当前thread可见 ThreadLocalmyThreadLocal = new ThreadLocal () { @Override protected String initialValue() { return UUID.randomUUID().toString(); } }; String name = Thread.currentThread().getName(); // 获取初始值 String initialValue = myThreadLocal.get(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 将当前thread的local-value改为指定值 myThreadLocal.set(UUID.randomUUID().toString()); System.out.println("Thread name: " + name + ", init: " + initialValue + ", next: " + myThreadLocal.get()); } }
Output:
Thread name: t2, init: 26e62cc8-1457-43a2-956c-6e53f5ccadd3, next: 7d32cd8d-7143-4879-a65b-a0841d2b6e9d Thread name: t1, init: 9ab664fc-0af2-4a1d-bcd8-e4f056b6748f, next: 7a6f44dc-bd20-438e-85be-ff42ba19ad6eInheritableThreadLocal
这个类继承自ThreadLocal。顾名思义,目的就是让child-thread可以访问parent-thread的local-value。而且可以通过重写childVaule()方法任意改变parent-thread的local-value.
InheritableThreadLocal 简单例子package cn.lw.thread; import java.util.UUID; /** * @author wanglei 2018年5月3日 */ public class ThreadLocalDemo { public static void main(String[] args) { new Thread(new ParentClass("p1")).start(); new Thread(new ParentClass("p2")).start(); } } class ThreadLocalManager { // private static final ThreadLocallocalValue = new ThreadLocal<>(); private static final InheritableThreadLocal localValue = new InheritableThreadLocal<>(); public static void setLocalValue() { localValue.set(UUID.randomUUID().toString()); } public static String getLocalValue() { return localValue.get(); } public static void removeLocalValue() { localValue.remove(); } } class ParentClass implements Runnable { private String name; public ParentClass(String name) { this.name = name; } @Override public void run() { ThreadLocalManager.setLocalValue(); System.out.println("parent name: "+name+", loval value: "+ThreadLocalManager.getLocalValue()); String childName = name + "_child"; ChildClass childClass = new ChildClass(childName); Thread childThread = new Thread(childClass); childThread.start(); try { childThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } class ChildClass implements Runnable { private String name; public ChildClass(String name) { this.name = name; } @Override public void run() { System.out.println("child name: "+name+", loval value: "+ThreadLocalManager.getLocalValue()); } }
Output:
parent name: p2, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd parent name: p1, loval value: 48594e57-a114-43c1-980e-034074387d0a child name: p2_child, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd child name: p1_child, loval value: 48594e57-a114-43c1-980e-034074387d0a
ThreadLocal 主要源码可以参考这篇文章:ThreadLocal源码解读
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71100.html
摘要:我们通过之前几章的学习已经知道在线程间通信用到的关键字关键字以及等待通知机制。今天我们就来讲一下线程间通信的其他知识点管道输入输出流的使用的使用。将当前线程的此线程局部变量的副本设置为指定的值删除此线程局部变量的当前线程的值。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchr...
摘要:方法,删除当前线程绑定的这个副本数字,这个值是的值,普通的是使用链表来处理冲突的,但是是使用线性探测法来处理冲突的,就是每次增加的步长,根据参考资料所说,选择这个数字是为了让冲突概率最小。 showImg(https://segmentfault.com/img/remote/1460000019828633); 老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学...
摘要:等待通知机制利用,实现的一个生产者一个消费者和一个单位的缓存的简单模型上面例子中我们生产了一个数据后就需要对这个数据进行消费如果生产了但数据没有被获取则生产线程会在等待中直到调用了方法后才会被继续执行反之也是一样的也就是说方法是使线程暂停 等待/通知机制 利用wait,notify实现的一个生产者、一个消费者和一个单位的缓存的简单模型: public class QueueBuffer...
阅读 1315·2023-04-25 18:34
阅读 3406·2021-11-19 09:40
阅读 2805·2021-11-17 09:33
阅读 2919·2021-11-12 10:36
阅读 2802·2021-09-26 09:55
阅读 2634·2021-08-05 10:03
阅读 2494·2019-08-30 15:54
阅读 2846·2019-08-30 15:54