ThreadLocal实现原理

下面经过一个例子来证实经过ThreadLocal能达到在每一个线程中建立变量副本的效果:java

public class TestThreadLocal {
	public static ThreadLocal<String> threadLocal = new ThreadLocal<>();
	public static void main(String []args){
		threadLocal.set("hello world");
		Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("thread:"+threadLocal.get());
			}
		});
		thread.start();
		
		System.out.println("main:"+threadLocal.get());
	}
}

控制台输出:数据库

main:hello world
thread:null

ThreadLocal相关类图结构:ide

        Thread类中有一个ThreadLocalMap类型的变量threadLocals。threadLocals用来存储实际的变量副本,key为当前ThreadLocal变量,value为变量副本。线程

        初始化时,在Thread中threadLocals变量为null,只有当前线程第一次调用Thread的set()或get()方法thread中threadLocal进行初始化,而且以当前ThreadLocal变量为key,以ThreadLocal要保存的副本变量为value,存到threadLocals。若是要获取副本变量,经过ThreadLocal的get方法。code

       ThreadLocal最多见的使用场景是用来解决数据库链接、Session管理等。blog

相关文章
相关标签/搜索