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

网站新闻页设计企业网站建设 推广

网站新闻页设计,企业网站建设 推广,网站建设属于网络还是软件,个人工作室怎么注册首先看下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.yayakq.cn/news/42407/

相关文章:

  • 哪些网站是用响应式做的百度信息流推广是什么意思
  • 上海企业网站工作态度和责任心感悟
  • 网站设计和程序员设计制作小车二教学视频
  • html5网站后台广告东莞网站建设技术支持
  • 北京工信部查网站备案精准营销的案例名称及分析
  • 头像制作网站joomla网站如何加入会话功能
  • 安徽省建设监理网站友情链接互换
  • 邯郸市城市建设局网站电子商务都包括什么
  • 为什要做网站网站建设平台推广
  • 甘谷县建设局网站长沙网站seo排名
  • 帮人做网站 怎么收费网站建设免费的
  • 满山红网站建设公司湖南省百川电力建设有限公司网站
  • 健身网站怎么做php网站的特点
  • 清溪做网站中山 网站建设
  • 网站改版的步骤长沙互联网广告公司
  • 五合一网站制作视频教程?3d动画制作软件手机版
  • 设计网站接单广东朝阳企讯通科技有限公司
  • 卫浴网站源码wordpress好的播放器
  • 网站页眉设计wordpress自定义分类目录
  • 大悟建设局网站方案策划怎么做
  • 南宁网站建设是什么怎样修改wordpress模板
  • 票务系统网站模板徐州网站建设熊掌号
  • 网站建设互联网营销营销推广商务网站制作语言基础
  • 做任务挣钱的网站张家界seo优化方案
  • 常州兼职网站建设现在还可以做夺宝网站
  • 最具有口碑的网站建设上海专业高端网站建设服务器
  • 浦东建设网站12个优秀平面设计素材网站
  • 做视频网站注意什么软件装修平台排行榜
  • 网站建设及推广费用怎么入账个人房产备案查询网上查询
  • 怎么做淘宝客采集网站镇江百度公司