java高级之线程范围内的共享数据
来源:互联网 发布:淘宝延时收货多少天 编辑:程序博客网 时间:2024/06/05 18:42
1、什么叫线程范围的数据共享
在Java线程中,有的时候需要使用多个线程,并且多个线程之间数据独立,但在每个线程内部是数据共享的,如下图中有n个线程thread,但是每个thread只操作自己对应的数据(这就叫线程范围内数据共享),不会操作其他线程所对应的数据(这叫线程外数据独立)。比如实际列子中到银行取钱,张三给李四存钱,王五取钱,相当于两个线程操作两组数据,张三的钱不能转到王五的账号上,王五取的钱不能是李四账号上的钱。这就是线程范围内的数据共享。
thread1data1thread2data2…… threadndatan2、如何实现线程范围内数据
可以将各自的数据与线程对应起来,用map存储,用对应的线程为key,以每个线程内的数据为value即可,demo如下:
public class Demo{ private static final Map<Thread,Integer> threadData = new HashMap<Thread,Integer>(); public static void main(){ for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override onRun(){ int data=new Random().nextInt(); threadMap.put(Thread.currentThread,data); new A().get(); new B().get(); } }).start(); } } public static class A{ public void get(){ data = threadMap.get(Thread.currentThread); System.out.println("A "+Thread.currentThread.getName()+" data:"+data); } } public static class B{ public void get(){ data = threadMap.get(Thread.currentThread); System.out.println("B "+Thread.currentThread.getName()+" data:"+data); } }}
3、ThreadLocal类
Java 提供了类似与2中提到的map功能,做到线程内数据共享,线程外独立:ThreadLocal类。ThreadLocal类的原理其实就是内部用的就是map,key是当前线程,value是T(泛型),demo2如下:
public class Demo2{ private static final ThreadLocal<Integer> threadData = new ThreadLocal<Integer>(); public static void main(){ for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data=new Random().nextInt(); threadData.set(data);//存储,默认key就是当前线程 new A().get(); new B().get(); }).start(); } } public static class A{ public void get(){ int data = threadData.get();//取数据,默认key就是当前线程 System.out.println("A "+Thread.currentThread.getName()+" data:"+data); } } public static class B{ public void get(){ int data = threadData.get();//取数据,默认key就是当前线程 System.out.println("B "+Thread.currentThread.getName()+" data:"+data); } }}
注意:ThreadLocal类只能放一种泛型的数据,如果有多种数据类型的数据需要线程内数据共享,那么就需要数据打包即可。其次当不需要ThreadLocal类所保存的数据时候,可以调用clear方法释放内存。其次如果不调用ThreadLocal的clear方法释放内存,当线程结束后,会自动的释放对应线程中的数据,达到释放内存的效果。
1 0
- java高级之线程范围内的共享数据
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- java线程范围内的数据共享
- 多线程并发库高级应用 之 线程范围内共享数据
- 多线程并发库高级应用 之 线程范围内共享数据
- java多线程并发库高级应用 之 线程范围内共享数据
- 线程范围内的数据共享
- 黑马程序员-线程范围内的数据共享之ThreadLocal
- 多线程之线程范围内的数据共享ThreadLocal
- Java中如何实现单个线程范围内的数据共享
- java并发编程(4)--线程范围内的共享数据
- Java线程范围内的共享数据(1)
- Java线程范围内的共享数据(2)
- java多线程:5、线程范围内的数据共享_ThreadLocal
- 【java并发】线程范围内共享数据
- 线程范围内共享数据
- 线程范围内数据共享
- 线程范围内共享数据
- Java并发编程:深入剖析ThreadLocal
- 排序
- 有关于高德地图的大头针下落动画。还有就是高德地图的设置
- 加载apk,并启动apk中activity
- 贪心算法—Problem O
- java高级之线程范围内的共享数据
- 关于硬链接和软连接(符号链接)的区别
- rebmuNylgU.263
- 知识的迷宫 网络上的时间是如何度过的
- linux找不到网卡配置文件解决办法
- BZOJ 2001: [Hnoi2010]City 城市建设
- Android中自定义控件View
- 敏捷开发之Scrum扫盲篇
- Java单例模式的写法