深入多线程4

线程局部变量
线程局部变量也叫线程局部存储,ThreadLocal类给每个线程都添加了一个变量,专门来存储每一个线程自己的数据
常用函数

深入多线程4_第1张图片
QQ截图20170821180548.png

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 local = new ThreadLocal(){
        @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);
    
    }
}

你可能感兴趣的:(深入多线程4)