ThreadLocal实现线程范围内的共享变量
ThreadLocal变量自动与当前线程相关联,替代Map,HashMap结构:
package cn.qy.heima2;import java.util.Random;public class ThreadLocalTest {private static ThreadLocal<Integer> xLocal= new ThreadLocal<Integer>();public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<2;i++){new Thread(new Runnable() { @Overridepublic void run() {// TODO Auto-generated method stubint data=new Random().nextInt(); System.out.println(Thread.currentThread().getName()+"has put data:"+data); xLocal.set(data); //xLocal与当前线程相关,进行数据存放 new A().get();new B().get();}}).start(); }} static class A { public void get() { int data=xLocal.get(); //xLocal与当前线程相关,进行数据取出 System.out.println("A from"+Thread.currentThread().getName()+"get data:"+data); } } static class B { public void get() { int data=xLocal.get(); System.out.println("B from"+Thread.currentThread().getName()+"get data:"+data); } } }
将多个共享变量封装为一个对象放入ThreadLocal变量里面:
package cn.qy.heima2; import java.util.Random; public class ThreadLocalTest {private static ThreadLocal<Integer> xLocal= new ThreadLocal<Integer>();private static ThreadLocal<MyThreadScopeData> mythreadScopedata=new ThreadLocal<MyThreadScopeData>();public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<2;i++){new Thread(new Runnable() { @Overridepublic void run() {// TODO Auto-generated method stubint data=new Random().nextInt(); System.out.println(Thread.currentThread().getName()+"has put data:"+data); xLocal.set(data); //xLocal与当前线程相关,进行数据存放MyThreadScopeData mydata= new MyThreadScopeData();mydata.setName("qianyong"+data);mydata.setAge(data);mythreadScopedata.set(mydata);new A().get();new B().get();}}).start(); }} static class A { public void get() { int data=xLocal.get(); //xLocal与当前线程相关,进行数据取出 System.out.println("A from"+Thread.currentThread().getName()+"get data:"+data); MyThreadScopeData mydata=mythreadScopedata.get(); System.out.println("A from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge()); } } static class B { public void get() { int data=xLocal.get(); System.out.println("B from"+Thread.currentThread().getName()+"get data:"+data); MyThreadScopeData mydata=mythreadScopedata.get(); System.out.println("B from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge()); } } }class MyThreadScopeData { private String name; private int age; public String getName() {return name; } public void setName(String name) {this.name = name; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } }
运行结果:
Thread-0has put data:-2141728227 Thread-1has put data:1848865996 A fromThread-1get data:1848865996 A fromThread-1,get myName:qianyong1848865996,get myAge:1848865996 A fromThread-0get data:-2141728227 A fromThread-0,get myName:qianyong-2141728227,get myAge:-2141728227 B fromThread-1get data:1848865996 B fromThread-1,get myName:qianyong1848865996,get myAge:1848865996 B fromThread-0get data:-2141728227 B fromThread-0,get myName:qianyong-2141728227,get myAge:-2141728227
通过ThreadLocal变量创建与某一线程相关联的单例对象:
package cn.qy.heima2; import java.util.Random; public class ThreadLocalTest {private static ThreadLocal<Integer> xLocal= new ThreadLocal<Integer>();private static ThreadLocal<MyThreadScopeData> mythreadScopedata=new ThreadLocal<MyThreadScopeData>();public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<2;i++){new Thread(new Runnable() { @Overridepublic void run() {// TODO Auto-generated method stubint data=new Random().nextInt(); System.out.println(Thread.currentThread().getName()+"has put data:"+data); xLocal.set(data); //xLocal与当前线程相关,进行数据存放/*MyThreadScopeData mydata= new MyThreadScopeData();mydata.setName("qianyong"+data);mydata.setAge(data);mythreadScopedata.set(mydata);*/MyThreadScopeData.getThreadInstance().setName("qianyong"+data);MyThreadScopeData.getThreadInstance().setAge(data);new A().get();new B().get();}}).start(); }} static class A { public void get() { int data=xLocal.get(); //xLocal与当前线程相关,进行数据取出 System.out.println("A from"+Thread.currentThread().getName()+",get data:"+data); /*MyThreadScopeData mydata=mythreadScopedata.get(); System.out.println("A from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge());*/ MyThreadScopeData mydata=MyThreadScopeData.getThreadInstance(); System.out.println("A from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge()); } } static class B { public void get() { int data=xLocal.get(); System.out.println("B from"+Thread.currentThread().getName()+",get data:"+data); /*MyThreadScopeData mydata=mythreadScopedata.get(); System.out.println("B from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge());*/ MyThreadScopeData mydata=MyThreadScopeData.getThreadInstance(); System.out.println("B from"+Thread.currentThread().getName()+",get myName:"+mydata.getName()+",get myAge:"+mydata.getAge()); } } }class MyThreadScopeData { private MyThreadScopeData() {}; public static /*synchronized*/ MyThreadScopeData getThreadInstance() {MyThreadScopeData instance=map.get();if(instance==null){instance = new MyThreadScopeData();map.set(instance);}return instance; } //private static MyThreadScopeData instance=null; //创建单例,饥汉模式 //new MyThreadScopeData(); 创建单例,饱汉模式private static ThreadLocal<MyThreadScopeData> map=new ThreadLocal<MyThreadScopeData>();private String name; private int age; public String getName() {return name; } public void setName(String name) {this.name = name; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } }
转载于:https://www.cnblogs.com/dddyg/p/10715760.html
ThreadLocal实现线程范围内的共享变量相关推荐
- ThreadLocal线程范围内的共享变量
模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread;import java.util.Hash ...
- Java多线程——线程范围内共享变量和ThreadLocal
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- 4、线程范围内的数据共享之ThreadLocal
1 /** 2 * 线程范围类的数据共享 3 * 核心:ThreadLocal类 4 * 实际场景: 5 * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的se ...
- 线程范围内的数据共享
1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runna ...
- Java高并发编程:线程范围内共享数据
笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...
- 高并发的epoll+线程池,epoll在线程池内
epoll是linux下高并发服务器的完美方案,因为是基于事件触发的,所以比select快的不只是一个数量级. 单线程epoll,触发量可达到15000,但是加上业务后,因为大多数业务都与数据库打交道 ...
- Java实现并发线程中线程范围内共享数据
---恢复内容开始--- 利用Map,HashMap键值对的数据结构,实现并发线程中线程范围内数据共享. package cn.qy.heima2;import java.util.HashMap; ...
- ThreadLocal和线程同步机制的对比
ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势? 同步机制中通过对象的锁机制保证同一时间只有一 ...
最新文章
- (转)jLink使用ITM机制实现调试stm32单片机
- Android SDK目录结构
- caioj 1063 动态规划入门(一维一边推1:美元和马克)
- getopt的用法与optarg
- 破旧立新,精准测试之道
- MySQL批量update数据(更新的数据值不同)
- [CodeForces 372A] Counting Kangaroos is Fun
- “阿里云核心竞争力”峰会首日中奖小伙伴名单公布!机械键盘等豪礼下午继续放出!...
- Python进行高斯积分(Gaussian integral)
- 消息称微软Windows暂停接受华为新订单;2019 Q1 亚太区公有云IaaS、PaaS服务收入排名现已揭晓……...
- 树型拓扑计算机网络的缺点是,计算机网络拓扑的优缺点 -电脑资料
- 基于SSM的应急指挥系统
- “不学数学就去当厨子”,兰大校友入选全球竞赛最强10人,决赛最后几小时才想起做题...
- 哪个心情不好来看看,老逗了
- 基于51单片机的电子时钟设计
- 支付功能----第三方支付公司
- 【哈佛大学:计算生物学 生物信息学】学习记录(二)
- python平方数_计算范围内的平方数(python)
- 关于蓝光影碟,有一些常识,你不一定知道
- oracle decode 01427,錯誤的ORA-01427:單行子查詢返回多個行。
热门文章
- 高级代码编辑器:sublime text 4 for Mac
- itest英语考试bug_itest(爱测试) 4.2.1 发布,开源BUG 跟踪管理 敏捷测试管理软件...
- P5718 【深基4.例2】找最小值
- mysql query false_mysql_query() 实施结果一直为false
- python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别
- python3类的继承详解_python3 多重继承机制
- 如何获取sharepoint列表_练习 34 - 获取列表元素 - Learn Python 3 The Hard Way
- java初始化数据报_java – 如何在Docker中初始化数据库后启动flyway
- python字典转dataframe_python DataFrame转dict字典过程详解
- C++设计模式-单例模式(双重锁定)