- 每个线程中,有自己创建的数据。
- 当前线程数据是共享的
- 线程之间数据是互斥的
/**
* 线程范围内共享变量
*
* @author yangbin
*
*/
public class ThreadScopeShare {
/**
* 创建两个线程,每个线程中 只能拿自己的数据
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
//随机数据
int data = new Random().nextInt(10);
//向数据区域放数据
DataScopeShare.getThreadScope().setAge(data);
DataScopeShare.getThreadScope().setName(Thread.currentThread().getName());
//打印数据
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
System.out.println("A"+DataScopeShare.getThreadScope().getName()+DataScopeShare.getThreadScope().getAge());
}
}
static class B{
public void get(){
System.out.println("B"+DataScopeShare.getThreadScope().getName()+DataScopeShare.getThreadScope().getAge());
}
}
}
class DataScopeShare{
//私有构建方法 禁止外部直接调用
private DataScopeShare(){};
//创建一个对象的实例 外部调用即可,不需要关注具体的实现
public static DataScopeShare getThreadScope(){
//从当前线程中 得到实例 如何有则返回实例,没有就创建(并且放进当前线程中去)
DataScopeShare dataScopeShare=threadScope.get();
if(dataScopeShare==null){
dataScopeShare=new DataScopeShare();
threadScope.set(dataScopeShare);
}
return dataScopeShare;
}
/*
* 使用ThreadLocal 保证每个线程中有独立的一个对象,并且每个线程中只有一份。 和其他线程互不影响
*/
private static ThreadLocal<DataScopeShare>threadScope=new ThreadLocal<DataScopeShare>();
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}