多线程(八)~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 ...
随机推荐
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- 010 Android Toolbar组件的应用(顶部菜单栏)
1 .取消app顶部project工程名显示 在styles.xml中进行相关设置 2.菜单列表项 <1>app--->res-->Android Resource Dicti ...
- Windows7下采用cygwin编译安装swoole扩展
常用命令 查看cygwin当前的版本: cygcheck -c cygwin 检查所有安装软件的版本号:cygcheck -c 查看某一个软件安装的版本:cygcheck -c 软件名称 查看本地已经 ...
- 【算法笔记】B1036 跟奥巴马一起编程
1036 跟奥巴马一起编程 (15 分) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴 ...
- 洛谷 P4568 [JLOI2011]飞行路线
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- P2387 [NOI2014]魔法森林
传送门 如果一条边只要考虑 $a$ 的限制,那么显然最小生成树 但是现在有 $a,b$ 两个限制,所以考虑按 $a$ 从小到大枚举边,动态维护 $b$ 的最小生成树 考虑新加入的一条边 $x,y$ , ...
- HDU1286
欧拉函数测试题 期末考试完了做下水题 更好的方法是phi[i]==i时就直接筛选,不改了 #include<bits/stdc++.h> using namespace std; cons ...
- c# 动态生成继承类并实现序列化特性
项目来源 App传过来的字段是动态的,希望能保证扩展性,返回时,把所需要的字段与数据融合后再返回过去 数据是第3方来源的,但是序列化后的结果又希望能并列返回 如:App传过来 一个设备Id,客户Id等 ...
- 1128 N Queens Puzzle (20 分)
The "eight queens puzzle" is the problem of placing eight chess queens on an 8 chessboard ...
- [转] 【译】让人倾倒的 11 个 npm trick
[From] https://segmentfault.com/a/1190000006804410 本文转载自:众成翻译译者:文蔺链接:http://www.zcfy.cc/article/1206 ...