一、线程数据共享和安全 -ThreadLocal
1 什么是 ThreadLocal
- ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
- ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]
- ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法
- 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个 ThreadLocal 对象实例
- 每个 ThreadLocal 对象实例定义的时候,一般为 static 类型
- ThreadLocal 中保存数据,在线程销毁后,会自动释放
2 快速入门 ThreadLocal
演示 ThreadLocal (作用:在一个线程中, 共享数据(线程安全))的使用
创建Dog,Pig类
创建T2DAO类
package com.hspedu.threadlocal;
public class T2DAO {
public void update(){
Object o = T1.threadLocal1.get();
String name =Thread.currentThread().getName();//获取当前线程名
System.out.println("在TDAO的update()线程是="+name+" 取出的dog= "+o);
}
}
创建T1Service类
package com.hspedu.threadlocal;
public class T1Service {
public void update(){
//取出ThreadLocal对象关联的对象
Object o = T1.threadLocal1.get();
String name=Thread.currentThread().getName();
System.out.println("在T1Service的update()线程name= "+name+" dog= "+o);
//调用了dao-update方法
new T2DAO().update();
}
}
ThreadLocalTest