线程本地存储是解决多个线程共享一个资源(资源共享)的另一种方式。它相当于一个Map<Thread, Object>, 把一个线程和它的状态(数据)关联起来。
上代码
package com.lyj;
/**
* 防止多个线程共享一个资源-----去除对变量的共享
* 线程本地存储 java.lang.ThreadLocal类,相当于一个Map<Thread, Object>
*
*/
import java.util.Random;
public class ThreadLocalDemo {
private static ThreadLocal<Integer> value = new ThreadLocal<Integer>();
private static ThreadLocal<MyInfo> myInfoData = new ThreadLocal<MyInfo>();
public static void main(String[] args) {
//产生2个线程
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " " + data);
// 保存当前线程的数据
// 相当于一个Map;
value.set(data);
// 保存一个打包的对象
// 存放多个数据
MyInfo myInfo = new MyInfo();
myInfo.setName("lyj");
myInfo.setAge(20);
myInfoData.set(myInfo);
new A().get();
//new B().get();
}
}).start();
}
}
static class A {
private static void get() {
int data = value.get();
MyInfo myinfo = myInfoData.get();
System.out.println("A " + Thread.currentThread().getName() + " " + data + " " + myinfo.getName() + " "
+ myinfo.getAge());
}
}
static class B {
private static void get() {
int data = value.get();
System.out.println("B " + Thread.currentThread().getName() + " " + data);
}
}
static class MyInfo {
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;
}
}
}