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

展示型网站建设价格成人电脑培训班办公软件

展示型网站建设价格,成人电脑培训班办公软件,中国最受欢迎的网站,日出东方网站建设目录 1.说明 2.弱引用的说明 3.最佳实践 4.方法说明 1.说明 在每个Thread中包含一个threadlocalmap对象,ThreadLocalMap是TheadLocal的静态内部类 threadLocalMap内部是一个entry数组 每个entry的key是TheadLoca实例,key是一个弱引用 每个entry的va…

目录

1.说明

2.弱引用的说明

3.最佳实践

4.方法说明


1.说明

在每个Thread中包含一个threadlocalmap对象,ThreadLocalMap是TheadLocal的静态内部类

threadLocalMap内部是一个entry数组
每个entry的key是TheadLoca实例,key是一个弱引用
每个entry的value是设置的内容,是强引用

如果在方法中new 一个threadlocal实例时,内存占用如下:

+------------------+     +-------------------+     +-----------------------+
|  方法栈帧         |     |  堆内存           |     |  线程的 ThreadLocalMap |
|                  |     |                   |     |                       |
| threadLocal 引用 ──────> ThreadLocal实例    |     | +-------------------+ |
+------------------+     +-------------------+     | | Entry:            | || | Key:  弱引用ThreadLocal || | Value:强引用"value"  | || +-------------------+ |+-----------------------+

当方法结束后,方法栈帧弹出,这时ThreadLocal对象的引用消失,ThreadLocalMap中的Key(ThreadLocal对象)是弱引用(WeakReference)。

当外部对ThreadLocal的强引用消失后,GC回收时发现无强引用指定,

仅有 Entry 的弱引用指向
→ 立即回收 Key 对象,并将 Entry 的 Key 置为 null(弱引用自动被清除)。
虽然 Key 被回收,但 Entry 中的 value 仍是强引用,此时会形成:
Entry { key=null, value="SomeValue" } // Value 无法被访问,存在内存泄漏风险

2.弱引用的说明

弱引用特性:当 JVM 进行垃圾回收时,如果 Key 仅被弱引用指向(没有强引用),无论内存是否充足,都会回收该 Key 对象。 

为什么设计为弱引用?

主要目的:防止开发者忘记调用 remove() 时,ThreadLocal 对象本身无法被回收。

    如果 Key 是强引用:即使开发者不再使用 ThreadLocal,由于线程的 ThreadLocalMap 持有强引用,ThreadLocal 对象和 Value 会永远无法回收。

    弱引用设计是一种兜底机制,至少能回收 Key,但需配合 remove() 彻底清理。

3.最佳实践

①使用static + final 定义threadlocal实例

// 推荐:static + final 修饰
private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>();

static 确保全局唯一实例,避免重复创建,不是对象属性,而是类的属性,一直持有引用,除非类被卸载,final 防止意外修改引用

②使用完成后执行remove处理

try {
CONTEXT_HOLDER.set(value);
} finally {
CONTEXT_HOLDER.remove(); // 必须清理
}

remove处理会清楚key和value,确保可以被回收

4.方法说明

get方法:

    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();}
  1. 获取当前线程
  2. 根据线程获取线程的threadlocalmap变量
  3. 如果为空,代表首次赋值,会创建一个threadlocalmap实例,key设置为threadlocal实例,并将值保存为null
  4. 如果不为空,则根据threadlocal实例获取对应的内容

set方法:

    public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}
  1. 获取当前线程
  2. 获取线程的threadlocalmap变量
  3. 如果不为空,key设置为threadlocal实例,并将值保存为参数中传递的内容
  4. 如果为空,会创建一个threadlocalmap实例,key设置为threadlocal实例,并将值保存为参数中传递的内容

remove方法:

    public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());if (m != null)m.remove(this);}

 会清除key及value,并且无效Entry被清理

http://www.dtcms.com/wzjs/165836.html

相关文章:

  • 营销型网站优势seo简介
  • 怎么用asp.net做网站抖音视频排名优化
  • 做一个短视频app需要多少钱seo排名的方法
  • 哪个网站上可以做初中数学题微信群拉人的营销方法
  • 动漫谷网站建设策划书南宁seo优势
  • 网站设计与开发技术教程网络运营是做什么的
  • 成都精品网站建设全网营销有哪些平台
  • 阳泉推广型网站开发seo承诺排名的公司
  • 国外服务器网站打开慢seo及网络推广招聘
  • 网站怎么做留言板天津百度推广代理商
  • 网站做链接算侵权吗短视频新媒体推广
  • wordpress 去除rrs西安网站seo诊断
  • 聊城网站建设价位广告公司招聘
  • 学做旗袍衣服的网站广告留电话号的网站
  • 建设论坛网站需要做什么有趣的软文
  • html制作一个网页关键词优化的建议
  • it网站制作策划自己在家怎么做跨境电商
  • 做网站必须内容真实性推广网站的四种方法
  • 建设网站需要的材料天门网站建设
  • 网站开发软件的选择沈阳seo关键词
  • 88影视网亲爱的热爱的电视剧大全seo外链软件
  • 各国网站的域名seo工具查询
  • 西安的电子商城网站建设网站检测中心
  • 公司网站建设维护管理办法国内时事新闻
  • 网站开发实用案例教程爱站网域名查询
  • 电子商务网站技术seo常见的优化技术
  • 找人做网站属于了解些什么呢营销手段有哪些方式
  • 宁夏正丰建设集团公司联网站软文广告图片
  • python制作网页的基本步骤北京seo优化
  • 网站和app可以做充值余额功能成都百度seo优化公司