线程范围内的共享变量是指对同一个变量,几个线程同时对它进行写和读操作,而同一个线程读到的数据就是它自己写进去的数据。
对于这种情况可以采用以下方法实现:
1.将写的数据放入一个Map的value中,key就是进行这个写操作的线程对象,这样读的时候每个线程就只能从Map中读到自己对应的value。
运行结果:
对于这种情况可以采用以下方法实现:
1.将写的数据放入一个Map的value中,key就是进行这个写操作的线程对象,这样读的时候每个线程就只能从Map中读到自己对应的value。
2.使用ThreadLocal,ThreadLocal类似Map,它可以为每个线程装载一个对象,这个对象是和线程绑定的,ThreadLocal在哪个线程中执行操作,它就会自动选择那个与线程绑定的对象。
package com.javase.thread;
import java.util.Random;
public class ThreadLocalTest {
public static void main(String[] args){
for(int i=0;i<2;i++){
new Thread(new Runnable(){
public void run() {
int data = new Random().nextInt();
MyThreadLocalData myThreadLocalData = MyThreadLocalData.getMyThreadLocalDataInstance();
myThreadLocalData.setAge(data);
myThreadLocalData.setName("name"+data);
new A().printData();
new B().printData();
}
}).start();
}
}
static class A{
public void printData(){
System.out.println(Thread.currentThread().getName()+" A data:"+MyThreadLocalData.getMyThreadLocalDataInstance().getName());
}
}
static class B{
public void printData(){
System.out.println(Thread.currentThread().getName()+" B data:"+MyThreadLocalData.getMyThreadLocalDataInstance().getName());
}
}
}
class MyThreadLocalData{
private String name ;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
private static ThreadLocal<MyThreadLocalData> threadLocal = new ThreadLocal<MyThreadLocalData>();
private MyThreadLocalData(){
}
private static MyThreadLocalData myThreadLocalData = null;
public static MyThreadLocalData getMyThreadLocalDataInstance(){
myThreadLocalData = threadLocal.get();
if(myThreadLocalData==null){
myThreadLocalData=new MyThreadLocalData();
threadLocal.set(myThreadLocalData);
}
return myThreadLocalData;
}
}
运行结果:
Thread-1 A data:name1151897441
Thread-0 A data:name1397351915
Thread-0 B data:name1397351915
Thread-1 B data:name1151897441