当前位置: 首页 > news >正文

苏州企业网站建站系统免费发帖平台

苏州企业网站建站系统,免费发帖平台,外贸公司英文网站怎么做,org后缀的网站ThreadLocal 什么是ThreadLocal ThreadLoacal类可以为每个线程保存一份独有的变量,该变量对于每个线程都是独占的。实现原理为每个Thread类中包含一个ThreadHashMap,key为变量的对应的ThreadLocal对象,value为变量的值。 在日常使用中&…

ThreadLocal

什么是ThreadLocal

ThreadLoacal类可以为每个线程保存一份独有的变量,该变量对于每个线程都是独占的。实现原理为每个Thread类中包含一个ThreadHashMapkey为变量的对应的ThreadLocal对象value为变量的

在日常使用中,我们可以通过set(value)方法设置值,然后通过get()方法获取值,示例代码如下:

我们通过线程池执行了五个线程,每个线程都有一份自己独有的id变量,实现了线程间的数据隔离。

@Slf4j
public class ThreadLocalTest {// ThreadLocal 变量,每个线程都有自己的副本private static final ThreadLocal<Integer> id = new ThreadLocal<>();@Testpublic void testThreadLocal() {// 创建线程池ExecutorService executorService = Executors.newCachedThreadPool();try {for (int i = 0; i < 5; i ++) {int finalI = i;executorService.execute(() -> {// 设置ThreadLocal 变量    id.set(finalI);// 获取ThreadLocal变量log.info("The id of thread {} is {}", Thread.currentThread().getName(), id.get());});}} finally {id.remove();executorService.shutdown();}}
}

传统的HashMap是链地址法,发生碰撞放入桶内;ThreadLocalMap是开放地址法,发生冲突放到后一位

实现原理

那如何实现这种线程间的数据隔离呢?一种容易想到的方法是在Map中进行存储,每个ThreadLocal变量内维护一个Map,其中key为每个线程的IDvalue为对应的值。这样当调用get()方法时,会通过hash算法找到对应线程的值。

jdk也确实是这么做的,只不过存放元素Map的实现不是HashMap,而是ThreadLocalMap,解决冲突的做法是开放寻址法,即出现冲突就往下一个临近位置找,直到找到空位置。

早期的实现中,多个线程会共享一个ThreadLocalMap,这样随着线程数的增加,map就需要扩容,会消耗较多的资源;

后来,每个线程都有自己的一个ThreadLocalMap,各自保存自己的局部变量,key为变量名,value为变量值。

因为局部变量很少,所以一般不需要扩容。

内存泄漏

下面这张图是ThreadLocal对应的引用关系,可以看到,在新的设计下,ThreadLocalMap存在于Thread中,是和Thread的生命周期一致的。

在这里插入图片描述

ThreadLocalMapkeyThreadLocal对象,value是对应的值,需要注意的是ThreadHashMapkey会使用弱引用,这主要是为了当ThreadLocalnull后,除了ThreadHashMap持有的弱引用外,没有别的强引用,ThreadLocal对象可以被GC回收

但是这样就导致ThreadHashMap中对应的keynull,其value引用的对象不会被GC回收,从而出现了内存泄漏。

所以在使用完ThreadLocal变量后,尽量使用remove()方法进行清理,这样会把keynull的键值对删除。

再回到上面的示例,上面的示例我们使用final修饰了ThreadLocal,保证其不会被修改,这样做会导致ThreadLocal永远存在强引用,不会被释放,容易发生内存泄露,所以需要我们显示调用remove()方法进行清理。

参考链接

ThreadLocal的内存泄露?什么原因?如何避免?

http://www.dinnco.com/news/70260.html

相关文章:

  • 做网站图片和文字字体侵权百度搜索排名靠前
  • 网站设计公司 上北京seo公司司
  • 网站建设和架构软文客
  • 怎么做网站报价表卖友情链接赚钱
  • 做网站满屏的照片尺寸是多少seo技术论坛
  • 北京东直门 网站建设网店推广方案策划书
  • 网站建设 事迹游戏推广员判几年
  • 秦皇岛做网站公司有哪些公众号引流推广平台
  • 江苏连云港网站建设公司学电商出来一般干什么工作
  • 杭州做网站公司百度搜索广告收费标准
  • wordpress影视站主题深圳百度推广电话
  • 网站的欢迎页怎么做百度客服在哪里找
  • 我先做个网站怎么做的网络推广发帖网站
  • 碑林网站制作百度推广教程视频教程
  • 电子商务网站建设及维护今天国际新闻
  • vue做的网站影响收录么上海短视频推广
  • 网站建设电话销售话术模板大全网站排名优化首页
  • 如何做学校网站app今日军事新闻报道
  • 做网站公司选哪家试分析网站推广和优化的原因
  • 定制做网站seo综合查询站长工具怎么用
  • 做网站要找什么人市场营销网站
  • 宝丰网站建设seo任务
  • 公司做网站的费用新闻发稿公司
  • 网站上的二维码怎么做中小企业网站
  • 怎么把asp网站做的好看app推广平台接单渠道
  • 企业做网站上海电视剧百度风云榜
  • 做网站注册会员加入实名认证功能百度首页网站推广多少钱一年
  • 余姚网站建设公司东莞寮步最新通知
  • 做网站投注代理犯罪吗新产品宣传推广策划方案
  • 新乡市网站建设电脑培训班北京优化seo排名