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

做网站要用服务器吗wordpress 微信导航

做网站要用服务器吗,wordpress 微信导航,商务网站建设注意事项,怎么删除WordPress外链在并发编程里,有时候我们需要让每个线程保存自己的私有数据,不想被其他线程干扰,这时候,ThreadLocal 就派上用场了。ThreadLocal 不是线程,而是为线程准备的私有数据仓库。一、ThreadLocal是什么?核心作用是…

在并发编程里,有时候我们需要让每个线程保存自己的私有数据,不想被其他线程干扰,这时候,`ThreadLocal` 就派上用场了。ThreadLocal 不是线程,而是为线程准备的私有数据仓库。

一、ThreadLocal是什么?核心作用是什么?它是怎么解决多线程共享变量的冲突的?

用一句话解释:每个线程有自己的小抽屉,别人看不见。什么时候用?典型场景:用户上下文、数据库连接、日志 TraceId 等。

二、核心结构

Thread、ThreadLocalMap、ThreadLocal三者关系

[Thread] └─ ThreadLocalMap├─ (ThreadLocalA, valueA)├─ (ThreadLocalB, valueB)

ThreadLocalMap 挂在线程身上,不是 ThreadLocal 身上。ThreadLocal 自己只是钥匙,负责把值放到线程的小抽屉里。

三、源代码核心

get和set源码最关键的逻辑

public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);...
}
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);...
}

Thread.currentThread() 找到自己。ThreadLocalMap 是真正存东西的地方。key 是 ThreadLocal 自己(this),value 是你要放入的值。

四、WeakReference与内存泄漏

  • 强引用:我们常常new出来的对象就是强引用类型,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足的时候
  • 软引用:使用SoftReference修饰的对象被称为软引用,软引用指向的对象在内存要溢出的时候被回收
  • 弱引用:使用WeakReference修饰的对象被称为弱引用,只要发生垃圾回收,若这个对象只被弱引用指向,那么就会被回收
  • 虚引用:虚引用是最弱的引用,在 Java 中使用 PhantomReference 进行定义。虚引用中唯一的作用就是用队列接收对象即将死亡的通知

ThreadLocalMap 里 key 是弱引用

static class Entry extends WeakReference<ThreadLocal<?>> {Object value;
}

如果ThreadLocal没引用了,key会被GC回收,但value还在,形成泄漏,因此推荐remove(),用完手动清理。

五·一、小例子

示例一:一个线程写私有值,这是验证 ThreadLocal 是当前线程私有存取容器 的最小闭环。

ThreadLocal<String> tl = new ThreadLocal<>();//造钥匙,准备给某个线程存私货
tl.set("hello");//把值塞到当前main线程的ThreadLocalMap里
System.out.println(tl.get());  // 用同一把钥匙去翻找,能拿回“hello”

示例二:多个线程隔离示例

ThreadLocal<Integer> tl = new ThreadLocal<>();//造钥匙
//下边启动五个线程
for (int i = 0; i < 5; i++) {int num = i;new Thread(() -> {tl.set(num);//把自己的 num 值放到自己线程的小抽屉(ThreadLocalMap)里System.out.println(Thread.currentThread().getName() + " -> " + tl.get());}).start();
}

虽然 5 个线程都用的是 同一把 tl,但是它们访问的 ThreadLocalMap 是自己线程私有的,所以:线程1放0,线程2放1......线程5放4。每个线程对同一个 ThreadLocal 只能拿到自己放进去的值。

五·二、再来

注释都写在代码中,有些长拖着看

import java.util.ArrayList;
import java.util.List;public class ThreadLocalTest {private List<String> messages = new ArrayList<>();public static final ThreadLocal<ThreadLocalTest> holder = ThreadLocal.withInitial(ThreadLocalTest::new); // 定义了一个 ThreadLocal,类型是 ThreadLocal<ThreadLocalTest>,每个线程里面都有自己的一份 ThreadLocalTest 对象。public static void add(String msg) { // 这个对象里有个 List<String> messages,相当于:每个线程都有一份“自己的私有 List”。holder.get().messages.add(msg); // 找当前线程自己的 ThreadLocalTest 对象。messages.add(msg):把消息塞进去。}public static List<String> clear() { // 拿到当前线程的List然后打印一下size,remove():把这个线程的 ThreadLocal 清理掉,防止内存泄漏。List<String> messages = holder.get().messages;holder.remove();System.out.println("size is " + messages.size());return messages;}// 下边启动了 10 个线程,每个线程往自己的 ThreadLocalTest 的 messages 里加一条 "msgX",再把自己那份 messages 打印出来。public static void main(String[] args) {Thread[] threads = new Thread[10];for (int i = 0; i < 10; i++) {int j = i;threads[i] = new Thread(() -> {ThreadLocalTest.add("msg" + j);List<String> messages = holder.get().messages;System.out.println(messages);});threads[i].start();}}
}

ThreadLocal 保证了:每个线程有自己的 ThreadLocalTest1 对象,互不干扰;同一个静态 holder,放进去的却是每个线程自己的 ThreadLocalMap 里的一份,所以即使你写了 static,每个线程也完全隔离,这就是 ThreadLocal 的意义。

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

相关文章:

  • 地铁网站建设特点dw网站建设教程视频教程
  • 用阿里云建设网站江苏城乡建设学校网站
  • 制作一个网站的步骤wordpress中的搜索
  • 东莞网站制作怎么做秒赞网站
  • 有没有网站教做美食的购买网站域名
  • 简述网络营销发展趋势做网站域名怎么选有利于seo
  • 高端网站设计地址wordpress文章目录在哪里
  • 金华网站制作网站 功能需求
  • 河北网站建设方案多张图做网站背景
  • 龙岗龙城街道网站建设wordpress图片转移
  • 服装网站建设公司推荐最常用免费h5制作平台
  • 公司做分享网站好吗上海网站建设费用多少
  • 网页模板免费下载网站投资公司取名字大全
  • 苏州建站推广公司国内有名的软件开发公司排名
  • 上海地区网站设计建工网官网校
  • 优度公司做的网站教育机构加盟
  • 做网站的收益免费ppt模板下载网站入口
  • .net网站模版做类似58类型网站
  • 网站建设前台后台论坛购物网站开发
  • 网站双倍浮动百度推广哪家做的最好
  • 网站中图片怎么做的移动端ui设计是什么
  • 网站怎么做团购网站建设落地页
  • 文本资料分享网站 建设dede制作的网站挂马
  • 漳州网站开发去博大钱少awordpress新手教程
  • 网站开发前端框架和后端框架网站建设 浏览器兼容
  • 企业网站建设的缺点重庆市建设工程信息网打不开是怎么回事
  • 廊坊建设局网站6jsp网站开发怎么调试
  • 百度的企业网站诸城手机网站建设
  • 三更app下载网站百度问一问官网
  • 石家庄网络营销网站推广网站建设死人接单