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

asp建设网站需要了解什么泉州做网站企业

asp建设网站需要了解什么,泉州做网站企业,网页翻译突然不翻译了,深圳市产品设计公司首先看下ThreadLocal的set()方法存数据的过程,首先获取当前的线程中保持的ThreadLocalMap,每个线程的ThreadLocalMap都是不一样的,因此存储的值是不同的。 public void set(T value) {Thread t Thread.currentThread();ThreadLocalMap map …

首先看下ThreadLocal的set()方法存数据的过程,首先获取当前的线程中保持的ThreadLocalMap,每个线程的ThreadLocalMap都是不一样的,因此存储的值是不同的。

    public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {map.set(this, value);} else {createMap(t, value);}}

如果在一个线程中首次使用ThreadLocal保持数据,则需要创建ThreadLocalMap,ThreadLocalMap中保存数据的实体是Entry,保存数据的过程就是先计算这个ThreadLocal对象的hashcode,根据hashcode计算在Entry数组中的位置,然后将创建的Entry保存在这个位置。

    void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);}ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {table = new Entry[INITIAL_CAPACITY];int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);table[i] = new Entry(firstKey, firstValue);size = 1;setThreshold(INITIAL_CAPACITY);}

如果在第一次之后使用ThreadLocal的话,则根据ThreadLocal计算hashcode,再根据hashcode计算Entry数组的索引,根据索引找到这个线程对应的Entry,如果是当前线程使用的ThreadLocalif (k == key),则将对象设置进来,即写到存储数据的Entry中。

        private void set(ThreadLocal<?> key, Object value) {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)]) {ThreadLocal<?> k = e.get();if (k == key) {e.value = value;return;}if (k == null) {replaceStaleEntry(key, value, i);return;}}tab[i] = new Entry(key, value);int sz = ++size;if (!cleanSomeSlots(i, sz) && sz >= threshold)rehash();}

当通过get()方法获取数据时,首先找到当前的线程对象,获取线程对象内部的ThreadLocalMap,然后根据ThreadLocal对象计算Entry的索引,找到本线程存储数据的Entry,获取Entry中的数据。

    public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}private Entry getEntry(ThreadLocal<?> key) {int i = key.threadLocalHashCode & (table.length - 1);Entry e = table[i];if (e != null && e.get() == key)return e;elsereturn getEntryAfterMiss(key, i, e);}
  • ThreadLocal内存泄漏的问题
    可以看到Entry是指向ThreadLocal的弱引用,弱引用不会阻止gc的垃圾回收,如果这个ThreadLocal对象置为null,指向ThreadLocal对象的弱引用不会阻止gc的垃圾回收,此时ThreadLocal对象存在但是无法访问,通过get()方法获取value时需要计算ThreadLocal对象的hashcode,在ThreadLocal对象被回收的情况就无法计算hashcode,也就无法访问这个value引用的对象,造成内存泄漏了。
        static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}

解决方法:

  1. 将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,可以通过ThreadLocal对象访问到保存的数据,不会造成内存泄漏
  2. 调用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();expungeStaleEntry(i);return;}}}
http://www.sczhlp.com/news/69007/

相关文章:

  • 做暧暧网站在线郴州吧
  • 电商网站建站开发语言app微信小程序
  • 长春建设工程管理中心网站电子工程网下载
  • 江苏省建设执业中心网站购物网站建设优缺点
  • 怎么使用vs2017做网站网站建设调研提纲
  • 上海网站建设外贸源码分享网站
  • 做执法设备有哪些网站app关键词优化
  • 房地产开发网站建设搭建网站php源码
  • 关于网站建设与发布的书籍wordpress禁止外链
  • 上海品牌网站建设公如何仿造一个网站做
  • 免费做网站电话合肥网站制作哪家强
  • 海南网站建设海南网络公司网站秒收录
  • 中国建设银行官方网站诚聘英才频道广州培训做网站
  • 阿里云网站备案网站建设方案书用户注册和登录网站怎么做的
  • 专业返利网站建设推广品牌
  • 什么软件制作网站快奢侈品网站建设方案
  • 【复健笔记】The 2024 ICPC Asia East Continent Online Contest (I)
  • CF1594F Ideal Farm
  • 从零构建前端监控框架:原理与实践
  • 合肥网站维护公司网站主页怎么做
  • 网站运营工作具体做啥工作作风建设网站
  • 网站建设与制作设计公司淘宝优惠券网站建设总代
  • CF Gym103536B Troubles 做题记录
  • 高仿卡地亚手表网站成都网址建设
  • 用qq邮箱做网站劳务派遣公司注册条件
  • 郑州建设网站制作公司成都工商注册
  • 宜昌网站设计怎样装修公司网站
  • 网站根目录 设置微博推广方式有哪些
  • 网站qq 微信分享怎么做wordpress中的角色
  • 网上接单网站网站建设哪家go