package DuoXianCheng;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareDate {
private static int data=0;
private static Map<Thread,Integer> map = new HashMap<Thread,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=0;i<2;i++){
new Thread (new Runnable(){
public void run(){
data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
// map.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
static class A
{
public int get (){
// int data=map.get(Thread.currentThread());
System.out.println("A FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;
}
}
static class B
{
public int get (){
// int data=map.get(Thread.currentThread());
System.out.println("B FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;
}
}
}
输出结果:在线程0中产生data为-499510563,
但在“A FROM Thread-0has
get data:-1733776812”A在线程0的范围内获得的缺失
线程1产生的数据。这里就产生了方法A没有在线程0范围内使用变量的问题。
正常情况向应该是在线程0范围内产生的数据,在线程0范围内的任何方法都应该使用同一个变量值。
Thread-0has put data:-499510563
Thread-1has put data:-1733776812
A FROM Thread-1 has get data:-1733776812
A FROM Thread-0 has get data:-1733776812
B FROM Thread-0 has get data:-1733776812
B FROM Thread-1 has get data:-1733776812
示例二,采用hashmap存储数据保证线程安全
package DuoXianCheng;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareDate {
private static int data=0;
private static Map<Thread,Integer> map = new HashMap<Thread,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=0;i<2;i++){
new Thread (new Runnable(){
public void run(){
int data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
map.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
static class A
{
public int get (){
int data=map.get(Thread.currentThread());
System.out.println("A FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;
}
}
static class B
{
public int get (){
int data=map.get(Thread.currentThread());
System.out.println("B FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;
}
}
}
输出结果:可以看到在线程0或者1范围内产生的值和,A/B在该线程内获得的值一致。
Thread-1has put data:-2078181451
Thread-0has put data:-1035167699
A FROM Thread-1 has get data:-2078181451
A FROM Thread-0 has get data:-1035167699
B FROM Thread-0 has get data:-1035167699
B FROM Thread-1 has get data:-2078181451