多线程(八)~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{
@Override
publicvoid 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{
@Override
publicvoid 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:95
ThreadA:ThreadA:95
ThreadB:ThreadB:96
ThreadA:ThreadA:96
ThreadB:ThreadB:97
ThreadA:ThreadA:97
ThreadA:ThreadA:98
ThreadB:ThreadB:98
ThreadB:ThreadB:99
ThreadA:ThreadA:99
ThreadB:ThreadB:100
ThreadA:ThreadA:100
publicstaticfinalThreadLocal myLocal =newThreadLocal(){
protectedObject initialValue(){
return250;
};
};
System.out.println("默认值为:" + TicketThread.myLocal.get());
默认值为:250
package com.wang.threadlocal;
publicclassPersonimplementsRunnable{
@Override
publicvoid 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 ...
随机推荐
- vue从一个页面跳转到另一个页面并携带参数
1.需求: 点击商场跳转到商业体列表 解决方案: 元页面: a标签中添加跳转函数 <a class="orderBtn1 sIRicon2" href="javas ...
- C++_类继承4-访问控制protected
public和private来控制对类成员的访问. 还存在另外一个访问类别,这种类别用关键字protected表示.protected和private相似,在类外只能用公有类成员来访问protecte ...
- bzoj 1005: [HNOI2008]明明的烦恼 树的prufer序列+万进制
题目传送门 思路: 这道题需要前置知识prufer编码,这篇博客对prufer编码和这道题的分析写的很好. 这里主要讲一些对大数阶乘的分解,一个办法当然是用高精度,上面这篇博客用的是java,还有一个 ...
- Codeforces - 38G 可持久化Treap 区间操作
题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也 ...
- HDU - 1024 M子段最大和 简单DP
如何确保每个段至少一个数是关键(尤其注意负数情况) #include<iostream> #include<algorithm> #include<cstdio> ...
- springboot(七)-系列功能配置
热部署 我们程序员在开发web项目的时候,避免不了需要将项目放到tomcat或者其他web容器中运行测试,而所有的程序员都有个习惯,从来都是以debug模式启动的(就好像谁不是这样启动就不是优秀的程序 ...
- TensorFlow-多层感知机(MLP)
TensorFlow训练神经网络的4个步骤: 1.定义算法公式,即训练神经网络的forward时的计算 2.定义损失函数和选择优化器来优化loss 3.训练步骤 4.对模型进行准确率评测 附Multi ...
- Jmeter4.0----HTTP Cookie管理器(9)
1.说明 在脚本编写的过程中,我们常常会遇到用户登录之后的相关操作,但是又不想去通过脚本先模拟用户登录,再使用cookie值保持登录,做后续的操作的情况下,我们就会用到HTTP Cookie管理. H ...
- linux 登陆失败处理
1.备份要操作的两个配置文件 cp /etc/pam.d/sshd /etc/pam.d/sshd.bak cp /etc/pam.d/login /etc/pam.d/login.bak 2.检查是 ...
- innoback 参数及使用说明
--defaults-file 同xtrabackup的--defaults-file参数,指定mysql配置文件; --apply-log 对xtrabackup的--prepare参数的封装; - ...