线程范围内共享数据(一)

来源:互联网 发布:新加坡航空公司 知乎 编辑:程序博客网 时间: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
原创粉丝点击