Java中ThreadLocal的用法和原理是什么


这篇文章主要介绍“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)拿到线程中的ThreadLocalMapThreadLocalMap是一个重新实现的散列表,基于两个元素实现散列:用户定义的ThreadLocal对象,例如:dateFormatLocal。封装了valueEntry对象。通过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 -> EntryThreadLocal由于是弱引用会,在GC的时候会被销毁,这会导致ThreadLoalMap中存在Entry使用remove()由于线程池中的线程一直在运行,如果不对ThreadLoalMap进行清理,那Entry会一直占用内存。remove()方法会清除key==nullEntry使用static修饰ThreadLocal设置成static可以避免一个线程类多次传入线程池后重复创建Entry。例如,有一个用户定义的线程使用线程池处理10个任务。那么线程池中每个用来处理任务的线程的Thread.ThreadLocalMap中都会保存一个Entry,由于添加了static关键字,所有每个线程中的Entry中的local变量引用的都是同一个变量。这时就算发生内存泄漏,所有的Test类也只有一个local对象,不会导致内存占用过多。到此,关于“Java中ThreadLocal的用法和原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: Gradle怎么修改默认的Build配置文件名

本文小编为大家详细介绍“Gradle怎么修改默认的Build配置文件名”,内容详细,步骤清晰,细节处理妥当,希望这篇“Gradle怎么修改默认的Build配置文件名”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Gradle默认使用b…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/28 12:03
下一篇 06/28 12:03

相关推荐