• ThreadLocal使用


    一句话总结

    将T value存到当前线程的Map中,键为ThreadLocal对象,值为T value

    ThreadLocal是什么

    一个可以保存变量在现场内部的类

    ThreadLocal可以做什么

    保存变量,使变量仅对对应的线程起作用

    ThreadLocal怎样使用

    ThreadLocal.set(T value) :写入一个值到ThreadLocal对象中
    T ThreadLocal.get() :得到写入的值
    ThreadLocal.remove():移除写入的值

    ThreadLocal在哪些情况下使用

    多线程多实例(每一个线程对应一个实例)的对象访问

    使用实例:使用THreadLocal保存Connection对象进行事务控制

    /**
     * 将Connection保存到当前线程中,单实例
     * 
     * @author Administrator
     *
     */
    public class ConnectionContext {
    	private ThreadLocal<Connection> connectionThreadLocal = new ThreadLocal<>();
    	private static ConnectionContext instance = new ConnectionContext();
    
    	private ConnectionContext() {
    	}
    
    	public static ConnectionContext getInstance() {
    		return instance;
    	}
    
    	/**
    	 * 将Connection对象绑定到当前线程中,键为connectionThreadLocal对象,值为connection对象
    	 * 
    	 * @param connection
    	 */
    	public void bind(Connection connection) {
    		connectionThreadLocal.set(connection);
    	}
    
    	/**
    	 * 得到绑定的Connection对象
    	 * 
    	 * @return
    	 */
    	public Connection get() {
    		return connectionThreadLocal.get();
    	}
    
    	/**
    	 * 移除绑定的Connection对象
    	 */
    	public void remove() {
    		connectionThreadLocal.remove();
    	}
    }
    

    原理分析

    public class ThreadLocal<T> { 
        //设置一个value
        public void set(T value) {
            //获取调用当前ThreadLocal对象的线程
            Thread t = Thread.currentThread();
            /*
             *得到此线程的ThreadLocalMap,每一个线程中都有一个
             *ThreadLocal.ThreadLocalMap threadLocals 对象
             *
             *ThreadLocalMap getMap(Thread t) {
             *    return t.threadLocals;
             *}  
             */
            ThreadLocalMap map = getMap(t);
            //将变量value保存入此map的值中,键为调用此方法的ThreadLocal对象
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }  
         //获取保存的value值
        public T get() {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null) {
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null) {
                    @SuppressWarnings("unchecked")
                    T result = (T)e.value;
                    return result;
                }
            }
            /*
             *如果没放入值则返回初始化值
             *默认初始化值为null,可以通过继承重写的方式设定初始化值
             *protected T initialValue() {
             *    return null;
             *}  
             */
            return setInitialValue();
        }  
         static class ThreadLocalMap { 
        }
        //清除value
         public void remove() {
             ThreadLocalMap m = getMap(Thread.currentThread());
             if (m != null)
                 m.remove(this);
         } 
        ... 
        ...
    } 
    
  • 相关阅读:
    Python学习笔记--8.3 函数--返回值
    Python学习笔记--8.2 函数--默认值参数
    Python学习笔记--9 非空即真,非零即真
    [Robot Framework] 支持python 3 的 robot framework 安装
    Mysql DB 无法创建 function,报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL
    vue项目中console.log报错 No Console
    git命令合并分支代码
    远程桌面连接时如何使用本地扬声器和麦克风
    [Grafana] 如何把不同series的点用线连接起来
    POM 文件参考
  • 原文地址:https://www.cnblogs.com/onemind/p/5529158.html
Copyright © 2020-2023  润新知