【java开发多线程篇】之ThreadLocal是什么?

167 阅读2分钟

前言: 多线程的知识点很多,也是面试必考点,必须要懂得如何运用,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...

一、什么是ThreadLocal

ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离~。
简要言之: 往ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。

二、管理Connection

最典型的是管理数据库的Connection:当时在学JDBC的时候,为了方便操作写了一个简单数据库连接池,需要数据库连接池的理由也很简单,频繁创建和关闭Connection是一件非常耗费资源的操作,因此需要创建数据库连接池~
那么,数据库连接池的连接怎么管理呢??我们交由ThreadLocal来进行管理。为什么交给它来管理呢??ThreadLocal能够实现当前线程的操作都是用同一个Connection,保证了事务!

三、避免一些参数传递

通过set()将一些常用的参数保存好,往后直接使用get()进行使用,那么就不需要每个方法都进行传参了。

四:ThreadLocal实现的原理

每个Thread维护着一个ThreadLocalMap的引用
ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储
调用ThreadLocal的set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象
调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象
ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。
正因为这个原理,所以ThreadLocal能够实现“数据隔离”,获取当前线程的局部变量值,不受其他线程影响~

五、避免内存泄露

ThreadLocal内存泄漏的根源是: 由于ThreadLocalMap的生命周期跟Thread一样长,当线程关闭之后,如果没有手动删除ThreadLocalMap对应key就会导致内存泄漏,而不是因为弱引用。
想要避免内存泄露就要手动remove()掉!

参考博客:
Java中ThreadLocal的实际用途是啥?


结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)