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

宝塔如何添加ip域名做网站百度一级代理商

宝塔如何添加ip域名做网站,百度一级代理商,免费高清网站在线观看,自适应网站开发工具文章目录 ThreadLocal源码分析:set方法get方法remove方法 ThreadLocal内存泄漏问题 ThreadLocal ThreadLocal提供了线程局部变量,每个线程都可以通过set和get方法来对这个变量进行操作,但不会和其他线程的局部变量冲突,实现了线程…

文章目录

  • ThreadLocal
    • 源码分析:
      • set方法
      • get方法
      • remove方法
    • ThreadLocal内存泄漏问题

ThreadLocal

ThreadLocal提供了线程局部变量,每个线程都可以通过set和get方法来对这个变量进行操作,但不会和其他线程的局部变量冲突,实现了线程的数据隔离

源码分析:

set方法

public void set(T value) {Thread t = Thread.currentThread();//getMap就是为了获取当前线程的ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null)//如果map存在就直接以这个ThreadLocal为键,设置键和值map.set(this, value);else//否则就为他创建一个ThreadLocalMap,并设置第一个键和值createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {return t.threadLocals;
}
void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);
}

get方法

public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {//如果当前线程的ThreadLocalMap存在,就尝试获取对应键值对ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}//如果threadLocals不存在或者当前的ThreadLocal不存在于这个map中return setInitialValue();
}
private T setInitialValue() {T value = initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)//当前ThreadLocal不存在于map中,就加上,设置value为空map.set(this, value);else//如果map不存在就创建,并设置键值createMap(t, value);return value;
}
protected T initialValue() {return null;
}

remove方法

public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());if (m != null)m.remove(this);
}
private void remove(ThreadLocal<?> key) {Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len-1);for (Entry e = tab[i];e != null;e = tab[i = nextIndex(i, len)]) {if (e.get() == key) {//弱引用中的清除方法e.clear();//将key为null的键值对清除掉,get和set方法底层也有用到expungeStaleEntry(i);return;}}
}
private static int nextIndex(int i, int len) {return ((i + 1 < len) ? i + 1 : 0);
}

总结:

可以看出,ThreadLocal中并不存储值,只是作为一个key来让线程从ThreadLocalMap中获取value,从而实现了线程之间的数据隔离

  • 每个线程都维护着一个ThreadLocalMap,ThreadLocalMap是ThreadLocal的内部类
  • ThreadLocal中的set,实际上是向当前线程的ThreadLocalMap中设置值,键为创建的ThreadLocal对象

ThreadLocal内存泄漏问题

内存泄漏:程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况

内存溢出:要求分配的内存超过了系统能给的

ThreadLocal中作为map中的key使用,而且ThreadLocalMap中的key是弱引用,弱引用对象在gc时会被回收,而ThreadLocalMap和Thread的生命周期一样长,就会存在key为null的情况,value访问不到,从而引发内存泄漏。所以,使用ThreadLocal时最后最好调用remove方法显式调用expungeStaleEntry方法手动删除key为null的value,防止value的积累

ThreadLocal的get和set方法某些时候也会调用expungeStaleEntry方法,但这是不及时的,而且不一定每次都会执行

http://www.tj-hxxt.cn/news/57066.html

相关文章:

  • 网站建设相关语言最新国际消息
  • 成都网站优化报价一份完整的电商运营方案
  • 网站建设委托开发合同范本国内seo做最好的公司
  • 郑州做网站齿轮semester是什么意思
  • 网站开发案例详解 源代码重庆seo网站收录优化
  • 找人做效果图那个网站关键词优化报价推荐
  • asp.netmvc 做网站seo视频教程百度网盘
  • 小九自助建站百度关键词搜索量排名
  • 国内做日化官方网站百度seo关键词排名技术
  • 企业为什么要建网站口碑营销例子
  • 网站建设企业公司网络广告的计费方式
  • c语言在线编程网站百度手机助手网页版
  • 使用vue做的网站网络营销与直播电商是干什么的
  • wordpress左侧悬浮导航菜单源码嘉兴seo报价
  • 连云港网站制作公司口碑好长沙官网网站推广优化
  • 深圳公司网站开发淘宝店铺怎么推广
  • 天元建设集团有限公司汇票信誉seo优化公司信
  • 苏州网站建设sz sogou排名轻松seo 网站
  • 商城网站网络公司seo和sem的区别是什么?
  • 金融网站开发文档西安网站seo
  • 做个简单的导航网站推广普通话心得体会
  • 莆田网站制作优秀软文范例200字
  • 幻影图片一键制作网站天津快速关键词排名
  • 镇江手机网站制作电脑系统优化软件
  • 网站制作网站制作公司咨询热线福州seo优化
  • 为什么招聘网站做不大上海百度分公司电话
  • 电商网站建设渠道墨猴seo排名公司
  • 网站建设品最近国家新闻
  • 网站制作免费seo的基础优化
  • 展示型网站解决方案如何优化培训体系