一个线程运行的时候,可能调用a模块,b 模块,c 模块,或者3个变量,各个模块有可能访问线程的数据,假如定义static 的变量,abc 访问的都是同一个
package com.zkk;
import java.util.Random;
// 线程范围内的共享数据
public class ThreadScopShareData {
private static int data = 0;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public 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);
}
}
}
示例代码如上:打印结果:
接下来要创建出更多的线程
package com.zkk;
import java.util.Random;
// 线程范围内的共享数据
public class ThreadScopShareData {
private static int data = 0;
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public 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);
}
}
}
打印结果如下:
各自线程的数据应该是独立的。怎么实现让他们各自独立的效果呢?
ThreadLocal 可以很方便的实现线程范围内的变量 这个类就相当与一个map
一个线程有一个数据,只需要顶一一个ThreadLocal ,往这个变量存放数据就是于当前线程相关的,从这个ThreadLocal 取的数据也是当前线程的数据
如果程序里面有n 个变量,都是线程范围内共享的
总结:一个ThreadLocal 代表一个变量,故其中只能放一个数据,你有两个变量都要线程范围内共享,则要定义两个ThreadLocal 对象,