线程范围内共享数据作用和目的:线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据。即不同的线程对应不同的数据。如下图:
每个线程调用全局ThreadLocal对象的set方法,将相当于往其内的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。线程结束时可以调用ThreadLocal.clear()方法,这样做会更快地释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量。
- 1-1 一个线程范围内的数据共享的例子。
- import java.util.Hashtable;
- import java.util.Map;
- import java.util.Random;
- /*
- * 每个线程拥有自己独立的数据
- */
- public class ThreadScopeShareData {//三个模块中的一个
- private static int data=0;
- //实现各模块独立的效果
- private static Map<Thread, Integer> threadData=new Hashtable<Thread,Integer>();
- public static void main(String[] args) {
- for (int i = 0; i < 2; i++) {//两个线程
- new Thread(new Runnable() {//线程调用A模块和B模块
- @Override
- public void run() {
- int data=new Random().nextInt();
- System.out.println(Thread.currentThread().getName()
- +"has put data :"+data);//放进数据
- threadData.put(Thread.currentThread(), data);//放数据
- new A().get();
- new B().get();
- }
- }){}.start();
- }
- }
- static class A{//A模块
- public void get(){//取数据方法
- int data=threadData.get(Thread.currentThread());//取数据
- System.out.println("A from "+Thread.currentThread().getName()
- +" get data :"+data);
- }
- }
- static class B{//B模块
- public void get(){//取数据方法
- int data=threadData.get(Thread.currentThread());//取数据
- System.out.println("B from "+Thread.currentThread().getName()
- +" get data :"+data);
- }
- }
- }
运行结果:
从运行结果可以看出:线程范围内的共享数据,不同的线程对应不同的数据,而同一数据相对不同的线程应该是一致的,不能出现同一数据对不同的对象(线程,模块)是不同的数据。
比如在银行的账户中:一个模块往账户转入,一个转出,两个动作要不都做,要不都不做(保持数据的一致性),两个对象访问这个数据应该是一样的数据。
转载于:https://blog.51cto.com/020618/1182853