线程范围内共享数据(一)
来源:互联网 发布:新加坡航空公司 知乎 编辑:程序博客网 时间:2024/06/14 23:32
Java开发过程中,若单个线程需要在多个对象与模块中访问同一个变量,则通过静态变量就可以实现,那么问题来了,当存在多个线程,多个对象与模块去访问同一变量时,就不行了。例如
public class ThreadShare {private static int data = 0;public static void main(String[] args) {for(int i=0;i<3;i++){new Thread(new Runnable(){@Overridepublic void run() {data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);new A().get();new B().get();}}).start();}}static class A{public void get(){System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);}}static class B{public void get(){System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);}}}
这样输出的结果如下:
Thread-0 has put data :961464780Thread-1 has put data :180723255A from Thread-0 get data :961464780A from Thread-1 get data :180723255B from Thread-0 get data :180723255B from Thread-1 get data :180723255
可见存在多个线程时,A、B不同的模块中访问的同一变量得到的不是同一个值。那么如何才能保证多线程时,不同对象模块中访问的同一变量是同一的值呢??
两种方式:
(一)通过HashMap来存取。
(二)调用ThreadLocal类来实现
本篇讲述方式一,代码实现如下:
public class ThreadShare {private static int data = 0;private static Map<Thread, Integer> threadData=new HashMap<Thread,Integer>();public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable(){@Overridepublic void run() { int data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);threadData.put(Thread.currentThread(), data);new A().get();new B().get();}}).start();}}static class A{public void get(){int data=threadData.get(Thread.currentThread());System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);}}static class B{public void get(){int data=threadData.get(Thread.currentThread());System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);}}}
输出结果为
Thread-1 has put data :-936867372Thread-0 has put data :1218414176A from Thread-0 get data :1218414176A from Thread-1 get data :-936867372B from Thread-0 get data :1218414176B from Thread-1 get data :-936867372
可见,线程Thread-0中,A、B模块中访问的data变量都是1218414176;Thread-1中,A、B模块中访问的data变量都是-936867372。
至此,已经实现了线程范围内数据的共享。下一篇通过调用ThreadLocal类来实现。
0 0
- 线程范围内共享数据(一)
- 线程范围内共享数据
- 线程范围内数据共享
- 线程范围内共享数据
- 线程范围内共享数据
- ThreadLocal线程范围内共享数据
- 同一线程范围内数据共享
- 线程范围内共享数据(二)
- 线程范围内的数据共享
- ThreadLocal实现线程范围内的数据共享
- 多线程_线程范围内数据共享
- 黑马程序员-线程范围内数据共享
- 线程范围内的共享数据 ThreadLocal
- 《黑马程序员》线程范围内的数据共享
- ThreadLocal类实现线程范围内数据共享
- java线程范围内的数据共享
- 【java并发】线程范围内共享数据
- 20160529_线程范围内数据共享
- phonegap+jQuery mobile开发中碰到的问题集锦
- 【8】memcached实例
- 文字转换成Drawable
- 本人Struts2基础学习收录重点
- jquery Mobile点击显示加载等待效果
- 线程范围内共享数据(一)
- EditText属性之InputType小结
- 继承Animation自定义动画
- CSU OJ:1318 Small change(规律)
- 使用YUI Compressor压缩JS和CSS文件
- 用winsw让任何Windows程序都能运行为服务
- ASP.Net Ajax框架 Timer控件 计时器
- jQuery click事件自动执行?
- jquery click事件被多次执行?