线程局部变量
线程局部变量也叫线程局部存储,ThreadLocal类给每个线程都添加了一个变量,专门来存储每一个线程自己的数据
常用函数
set() : 想要存储的数据,调用set进行设置ThreadLocalMap
给当前线程存储数据,key 是当前线程 value 是set进的数据
get(): 获得 当前线程存储的数据(没有参数,其实内部是获取当前线程作为key找到存储在ThreadLocalMap中的值)
应用场景: 数据库链接 Session(会话)
package com.qf.demo5;
public class Test {
public static void main(String[] args) {
Resouce resouce = new Resouce();
Thread thread = new Thread(resouce,"张三");
Thread thread2 = new Thread(resouce,"李四");
Thread thread3 = new Thread(resouce,"王五");
Thread thread4 = new Thread(resouce,"赵六");
Thread thread5 = new Thread(resouce,"田七");
thread.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
/**
* 1 并发修改异常 (list集合 是线程不安全的 )
* 2
*
* 想要 每一个线程 都可以 单独的存储一个自己的数据
*
* @author Administrator
*
*/
class Resouce implements Runnable{
ThreadLocal<String> local = new ThreadLocal<String>(){
@Override
protected String initialValue() {// 设置 local里面的初始值, 即使 没有set 调用get 返回的也不是null返回的是 "很好"
return "很好";// 返回的 线程中在线程局部变量中存储的默认值
}
};
@Override
public void run() {
String string = Thread.currentThread().getName()+ (int)(Math.random()*100);
local.set(string);// 如果没有set 那get 得到就是初始值
System.out.println(string);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
local.remove();// remove 将 线程中 在线程局部变量中存储的数据移除,线程局部变量中 存在默认值
String data = local.get();// 不需要参数就可以得到当前线程的值 , 如果set过,得到就是set的值,如果没有set过 得到就是 初始值
System.out.println(data);
}
}