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实现线程范围内的共享变量相关推荐

  1. ThreadLocal线程范围内的共享变量

    模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread;import java.util.Hash ...

  2. Java多线程——线程范围内共享变量和ThreadLocal

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  3. 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)

    ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...

  4. 4、线程范围内的数据共享之ThreadLocal

    1 /** 2 * 线程范围类的数据共享 3 * 核心:ThreadLocal类 4 * 实际场景: 5 * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的se ...

  5. 线程范围内的数据共享

    1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runna ...

  6. Java高并发编程:线程范围内共享数据

    笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...

  7. 高并发的epoll+线程池,epoll在线程池内

    epoll是linux下高并发服务器的完美方案,因为是基于事件触发的,所以比select快的不只是一个数量级. 单线程epoll,触发量可达到15000,但是加上业务后,因为大多数业务都与数据库打交道 ...

  8. Java实现并发线程中线程范围内共享数据

    ---恢复内容开始--- 利用Map,HashMap键值对的数据结构,实现并发线程中线程范围内数据共享. package cn.qy.heima2;import java.util.HashMap; ...

  9. ThreadLocal和线程同步机制的对比

    ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势? 同步机制中通过对象的锁机制保证同一时间只有一 ...

最新文章

  1. (转)jLink使用ITM机制实现调试stm32单片机
  2. Android SDK目录结构
  3. caioj 1063 动态规划入门(一维一边推1:美元和马克)
  4. getopt的用法与optarg
  5. 破旧立新,精准测试之道
  6. MySQL批量update数据(更新的数据值不同)
  7. [CodeForces 372A] Counting Kangaroos is Fun
  8. “阿里云核心竞争力”峰会首日中奖小伙伴名单公布!机械键盘等豪礼下午继续放出!...
  9. Python进行高斯积分(Gaussian integral)
  10. 消息称微软Windows暂停接受华为新订单;2019 Q1 亚太区公有云IaaS、PaaS服务收入排名现已揭晓……...
  11. 树型拓扑计算机网络的缺点是,计算机网络拓扑的优缺点 -电脑资料
  12. 基于SSM的应急指挥系统
  13. “不学数学就去当厨子”,兰大校友入选全球竞赛最强10人,决赛最后几小时才想起做题...
  14. 哪个心情不好来看看,老逗了
  15. 基于51单片机的电子时钟设计
  16. 支付功能----第三方支付公司
  17. 【哈佛大学:计算生物学 生物信息学】学习记录(二)
  18. python平方数_计算范围内的平方数(python)
  19. 关于蓝光影碟,有一些常识,你不一定知道
  20. oracle decode 01427,錯誤的ORA-01427:單行子查詢返回多個行。

热门文章

  1. 高级代码编辑器:sublime text 4 for Mac
  2. itest英语考试bug_itest(爱测试) 4.2.1 发布,开源BUG 跟踪管理 敏捷测试管理软件...
  3. P5718 【深基4.例2】找最小值
  4. mysql query false_mysql_query() 实施结果一直为false
  5. python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别
  6. python3类的继承详解_python3 多重继承机制
  7. 如何获取sharepoint列表_练习 34 - 获取列表元素 - Learn Python 3 The Hard Way
  8. java初始化数据报_java – 如何在Docker中初始化数据库后启动flyway
  9. python字典转dataframe_python DataFrame转dict字典过程详解
  10. C++设计模式-单例模式(双重锁定)