多线程(八)~ThreadLocal、InheritableThreadLocal的使用
通过前面的学习,我们了解了在多线程+成员变量等情况下会出现线程安全的问题。那么解决线程安全问题除了使用synchronize关键字之外,还有另一种常用的解决思路,那就是使用ThreadLocal类,下面我们会对这个类做一下简介并指出两者的差异。
package com.multiThread.test.mythreadlocal;publicclassSampleTest{//线程本地变量publicstaticThreadLocal tl =newThreadLocal();publicstaticvoid main(String[] args){if(tl.get()==null){System.out.println("线程初始变量是空值");tl.set("我的值");}System.out.println(tl.get());System.out.println(tl.get());}}
package com.multiThread.util;publicclassThreadLocalUtil{publicstaticfinalThreadLocal<String> tl =newThreadLocal<String>();}
package com.multiThread.thread;import com.multiThread.util.ThreadLocalUtil;publicclassMyThreadLocalAimplementsRunnable{@Overridepublicvoid run(){for(int i =0;i<100;i++){ThreadLocalUtil.tl.set("ThreadA:"+(i +1));System.out.println("ThreadA:"+ThreadLocalUtil.tl.get());try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}}}}
package com.multiThread.thread;import com.multiThread.util.ThreadLocalUtil;publicclassMyThreadLocalBimplementsRunnable{@Overridepublicvoid run(){for(int i =0;i<100;i++){ThreadLocalUtil.tl.set("ThreadB:"+(i +1));System.out.println("ThreadB:"+ThreadLocalUtil.tl.get());try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}}}}
package com.multiThread.test.mythreadlocal;import com.multiThread.thread.MyThreadLocalA;import com.multiThread.thread.MyThreadLocalB;publicclassMyThreadRun{publicstaticvoid main(String[] args){MyThreadLocalA myThreadLocalA =newMyThreadLocalA();MyThreadLocalB myThreadLocalB =newMyThreadLocalB();Thread t1 =newThread(myThreadLocalA);Thread t2 =newThread(myThreadLocalB);t1.start();t2.start();}}
...ThreadB:ThreadB:95ThreadA:ThreadA:95ThreadB:ThreadB:96ThreadA:ThreadA:96ThreadB:ThreadB:97ThreadA:ThreadA:97ThreadA:ThreadA:98ThreadB:ThreadB:98ThreadB:ThreadB:99ThreadA:ThreadA:99ThreadB:ThreadB:100ThreadA:ThreadA:100
publicstaticfinalThreadLocal myLocal =newThreadLocal(){protectedObject initialValue(){return250;};};
System.out.println("默认值为:" + TicketThread.myLocal.get());
默认值为:250
package com.wang.threadlocal;publicclassPersonimplementsRunnable{@Overridepublicvoid run(){System.out.println("从父线程中获取线程变量:"+MyInheritableThradLocal.threadLocal.get());}}
package com.wang.threadlocal;publicclassInheritableTest{publicstaticvoid main(String[] args){MyInheritableThradLocal.threadLocal.set("who let the dogs out?");System.out.println("Main线程中的值为:"+MyInheritableThradLocal.threadLocal.get());Person person =newPerson();Thread t1 =newThread(person);t1.start();}}
多线程(八)~ThreadLocal、InheritableThreadLocal的使用的更多相关文章
- java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承
ThreadLocal类的使用 变量值的共享可以使用public static变量的形式,所有的线程都是用同一个public static变量.如果想实现每一个线程都有自己的值.该变量可通过Thr ...
- Java多线程:ThreadLocal
一.ThreadLocal基础知识 ThreadLocal是线程的一个本地化对象,或者说是局部变量.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的 ...
- 架构师养成记--6.单例和多线程、ThreadLocal
一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是thread ...
- 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程
1.多进程,multiprocessing模块, 进程间的通信:Queue[队列],Pipes[管子]2.多线程, 注意:线程公用变量,混乱 解决方法Lock:因为只有一个锁,所以当要执 ...
- Java多线程之 ThreadLocal
一.什么是ThreadLocal? 顾名思义它是local variable(线程局部变量).它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副 ...
- 三十八 ThreadLocal
在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 但是局部变量也有问题,就是在函数调用的 ...
- 并发和多线程(六)--ThreadLocal
ThreadLocal是什么? 当使用ThreadLocal修饰变量的时候,ThreadLocal会为每个使用该变量的线程提供独立的变量副本,每个线程可以独立改变自己的副本,而不 影响其他线程的变量副 ...
- 14、Java并发性和多线程-Java ThreadLocal
以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作.因此,尽管有两个线程同时执行一段相 ...
- java并发编程(九)ThreadLocal & InheritableThreadLocal
参考文档: https://blog.csdn.net/u012834750/article/details/71646700 threadlocal内存泄漏:http://www.importnew ...
- Java多线程基础-ThreadLocal
感谢原文作者:Yuicon 原文链接:https://segmentfault.com/a/1190000016705955 序 在多线程环境下,访问非线程安全的变量时必须进行线程同步,例如使用 sy ...
随机推荐
- tornado 04 模板
一.模板 #模板就是一个HTML文件,只是其中添加了模板语法,需要服务器的渲染才能正常显示数据 #通过render可以返回一个html网页,不过那都是固定的页面,固定的数据,如果数据是不确定的,是会不 ...
- 【DP】【构造】NOIp模拟题 演讲 题解
极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...
- P2754 [CTSC1999]家园
传送门 人在各个太空站流动,所以显然的网络流模型 因为不同时间能走的边不同,所以显然按时间拆点 但是因为不知道要多少时间,所以要枚举时间,动态拆点 每一点向下一个时间的同一点连流量为 $INF$ 的边 ...
- 零基础学QT编程
吴迪.2010.1 北京航空航天大学出版社 Qt资源 CSDN QT http://bbs.csdn.net/forums/Qt/ QT编程网 http://www.qtbcw.com/ 编程论坛 ...
- Selenium WebDriver 中鼠标和键盘事件分析及扩展
[From] http://www.51testing.com/html/18/631118-861557.html 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和 ...
- Kafka消费不到数据的特殊情况
我大约是把kafka消费不到数据的特殊情况都经历了一遍了吧= =. kafka消费不到数据的原因,首先检查配置之类的,如是否设置了group.id,对应的topic是否正确等等,这些不多说. 下面是我 ...
- java多线程-Lock
大纲: Lock接口 synchronized&Lock异同 一.Lock public interface Lock { void lock(); void lockInterruptibl ...
- VUE项目引入微信jssdk
npm i -S weixin-js-sdkimport wx from 'weixin-js-sdk'
- oracle 基础知识(七)----动态性能视图
一,动态性能视图介绍 动态性能视图属于数据字典,系统管理员用户 SYS 可以访问它们.在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关.虽然这些视图很像普通的数据库表,但它们不允许用户直 ...
- jacob自己动生成word文档目录
任务目的 1自动生成word文档目录. 用例测试操作步骤 在一个word文档的第二页填写占位符: {目录}保存.调用程序读取目标文档,自动根据标题生成目录到{目录}位置. 效果 关键代码 insert ...