一:作用
ThreadLocal其实就是一个变量,比如String,Integer,你可以进行指定。比如现在全局有个内置Integer的ThreadLocal。你可以开启多个线程,每个线程都对这个变量进行set,get,他们都是互不冲突的。(相当于每个线程都有自己的一份拷贝,修改这个值对其他线程里的这个变量没有影响)。
经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。
二:简单使用
创建一个Integer类型的ThreadLocal
三:方法
四:实现原理
看一个set方法,200行写获取当前的线程t。然后201行时得到一个ThreadLocalMap的变量。通过名字就看出来了,其实就是通过当前线程得到一个值的映射。然后进行set操作。点开getMap方法,返回的是一个线程的变量,点开这个变量我们就会跳转到Thread.java文件里面,说明每一个线程都有一个threadLocals对象。
五:简单原理总结:
TheadLocal是一个泛型类,保证可以接受任何类型的Object。每个线程内部都会维护一个ThreadLocalMap,这个map的key是弱引用。
如果都没有手动删除对应key,都会导致内存泄漏。
所以将线程的threadlocalmap里对应的key设置成弱引用。引用ThreadLoacl的引用没有了,即使没有手动删除,这个key也会被设置成null,然后value下次调用get、set、remove的时候都会删除key=null的value。
网友评论