这篇文章主要介绍“Java中ThreadLocal的用法和原理是什么”,在日常操作中,相信很多人在Java中ThreadLocal的用法和原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中ThreadLocal的用法和原理是什么”的疑惑有所帮助!接下来,请免费云主机域名跟着小编一起来学习吧!隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal
中管理的对象。使用junit
进行测试:结果如下,可以看到没有被ThreadLocal
管理的变量已经无法匹配正确的format。sync task–10 | 10-2023-04-11
sync task–9 | 9-2023-04-11
normal task2-3 | 2-2023-04-11
normal task2-5 | 2-2023-04-11
normal task2-10 | 2-2023-04-11
normal task2-6 | 2-2023-04-11
sync task–1 | 1-2023-04-11
normal task2-7 | 2-2023-04-11
normal task2-8 | 2-2023-04-11
normal task2-9 | 2-2023-04-11
sync task–6 | 6-2023-04-11
sync task–3 | 3-2023-04-11
sync task–2 | 2-2023-04-11
sync task–7 | 7-2023-04-11
sync task–4 | 4-2023-04-11
sync task–8 | 8-2023-04-11
normal task2-4 | 2-2023-04-11
normal task2-1 | 2-2023-04-11
sync task–5 | 5-2023-04-11
normal task2-2 | 2-2023-04-11从ThreadLocal
中获取数据的过程:先获取对应的线程。通过getMap(t)
拿到线程中的ThreadLocalMap
ThreadLocalMap
是一个重新实现的散列表,基于两个元素实现散列:用户定义的ThreadLocal
对象,例如:dateFormatLocal
。封装了value
的Entry
对象。通过map.getEntry(this)
方法,根据当前的threadlocal
对象在散列表中获得对应的Entry
如果是第一次使用get()
, 则使用setInitialValue()
调用用户重写的initialValue()
方法创建map并使用用户指定的值初始化。在这种设计方式下,线程死去的时候,线程共享变量ThreadLocalMap
会被销毁。注意Entry
对象是弱引用:弱引用的常见用法是:因此,在Entry
中,k
代表ThreadLocal
对象,它是弱引用。v代表ThreadLocal
管理的那个value
,是强引用。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。随着垃圾回收器活动的增加以及内存占用的不断增加,程序性能会逐渐表现出来下降,极端情况下,会引发OutOfMemoryError
导致程序崩溃。内存泄漏问题主要在线程池中出现,因为线程池中的线程是不断执行的,从任务队列中不断获取新的任务执行。但是任务中可能有ThreadLocal
对象,这些对象的ThreadLocal
会保存在线程的ThreadLocalMap
中,因此ThreadLocalMap
会越来越大。但是ThreadLocal
是由任务(worker)传入的,一个任务执行结束后,对应的ThreadLocal
对象会被销毁。线程中的关系是:Thread -> ThreadLoalMap -> Entry
。ThreadLocal
由于是弱引用会,在GC的时候会被销毁,这会导致ThreadLoalMap
中存在Entry
。使用remove()由于线程池中的线程一直在运行,如果不对ThreadLoalMap
进行清理,那Entry
会一直占用内存。remove()
方法会清除key==null
的Entry
。使用static修饰将ThreadLocal
设置成static
可以避免一个线程类多次传入线程池后重复创建Entry
。例如,有一个用户定义的线程使用线程池处理10个任务。那么线程池中每个用来处理任务的线程的Thread.ThreadLocalMap
中都会保存一个Entry
,由于添加了static
关键字,所有每个线程中的Entry
中的local
变量引用的都是同一个变量。这时就算发生内存泄漏,所有的Test类也只有一个local
对象,不会导致内存占用过多。到此,关于“Java中ThreadLocal的用法和原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
本文小编为大家详细介绍“Gradle怎么修改默认的Build配置文件名”,内容详细,步骤清晰,细节处理妥当,希望这篇“Gradle怎么修改默认的Build配置文件名”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Gradle默认使用b…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。