高级并发编程之 线程范围内安全共享数据(使用Map方式)
2016-01-08 10:19
796 查看
import java.util.HashMap; import java.util.Map; import java.util.Random; public class ThreadScopeShareData { private static int data=0; private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();//与线程绑定,不同的线程之间的数据相互独立 public static void main(String[] args) { final A a=new A(); final B b=new B(); for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override public void run() { int data=new Random().nextInt(); System.out.println(Thread.currentThread().getName()+"已经放置了数据"+data); threadData.put(Thread.currentThread(), data); a.get(); b.get(); } }).start(); } } static class A{ public int get(){ int data=threadData.get(Thread.currentThread()); System.out.println("A from "+Thread.currentThread().getName()+":"+data); return data; } } static class B{ public int get(){ int data=threadData.get(Thread.currentThread()); System.out.println("B from "+Thread.currentThread().getName()+":"+data); return data; } } }运行结果如下:
Thread-0已经放置了数据-144147512
Thread-1已经放置了数据1063579285
A from Thread-0:-144147512
A from Thread-1:1063579285
B from Thread-0:-144147512
B from Thread-1:1063579285
解析:线程范围内安全共享数据
虽然一直都是对象a在取数据,但是在两个不同的线程内,a.get()方法取到了不同的值,原因就在于map<Thread,Integer>的设计,数据与线程绑定,因此在不同的线程中,取到的数据也不同。
相关文章推荐
- Java-回调
- 初步了解 Java类加载子系统
- C++11 concurrent progamming (1) join/detach
- python 分片
- 使用Java抓取网页中所有的链接
- python 之变量
- Spring包详解
- Java EE V7.0学习笔记-JBoss Tools 4.3.0.Final安装失败
- Numpy:使用Matplotlib绘图
- php中mb_strlen,mb_substr根据中文长度截取字符串
- java split()
- Spring Data Jpa 自定义属性查询规则
- c# 保存数据到txt (追加)
- Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法
- 2016年Web设计的10大趋势
- Java线程大总结
- C++中覆盖、隐藏、重载
- Spring事务隔离级别介绍
- Java 多线程同时执行
- c++,或者cococ2dx怎么利用jsonbox写入数据到json文件