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

网站免费搭建seo在线培训机构

网站免费搭建,seo在线培训机构,seo搜索优化怎么做,西安做网站优化公司报价目录 使用ThreadLocal 例子 内部结构分析 源码解析 图示详解 ThreadLocal是Java中一个非常重要且常用的线程局部变量工具类,它使得每个线程可以独立地持有自己的变量副本,而不是共享变量,解决了多线程环境下变量共享的线程安全问题。下面我…

目录

使用ThreadLocal

 例子

内部结构分析

源码解析

 图示详解


ThreadLocal是Java中一个非常重要且常用的线程局部变量工具类,它使得每个线程可以独立地持有自己的变量副本,而不是共享变量,解决了多线程环境下变量共享的线程安全问题。下面我将从多个维度深入分析ThreadLocal的内部结构和工作原理。

使用ThreadLocal

// 1. 初始化:创建ThreadLocal变量
private static ThreadLocal<T> threadLocal = new ThreadLocal<>();// 2. 设置值:为当前线程设置值
threadLocal.set(value);  // value为要存储的泛型对象// 3. 获取值:获取当前线程的值
T value = threadLocal.get();  // 返回当前线程存储的值// 4. 移除值:清除当前线程的ThreadLocal变量(防止内存泄漏)
threadLocal.remove();

【注】使用时,通常将ThreadLocal声明为static final以保证全局唯一性

private static ThreadLocal<T> threadLocal = ThreadLocal.withInitial(() -> initialValue);

【注:】 withInitial里面放的是任何能够返回 T 类型实例的 Lambda / Supplier
只要 Supplier 的逻辑最终能 new(或从缓存、工厂、单例池等)拿出一个 T,就合法。

 例子

package com.qcby.test;import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class ThreadLocalTest {private List<String> messages = new ArrayList<>();public static final ThreadLocal<ThreadLocalTest> holder = ThreadLocal.withInitial(ThreadLocalTest::new);public static void add(String message) {holder.get().messages.add(message);}public static List<String> clear() {List<String> messages = holder.get().messages;holder.remove();return messages;}public static void main(String[] args) throws InterruptedException {// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(10);// 提交10个任务for (int i = 0; i < 10; i++) {final int threadId = i;executor.submit(() -> {ThreadLocalTest.add("线程" + threadId + "的消息" );// 打印当前线程的消息System.out.println("线程" + threadId + "的消息列表: " + holder.get().messages);// 清除当前线程的ThreadLocalThreadLocalTest.clear();});}// 关闭线程池executor.shutdown();executor.awaitTermination(1, TimeUnit.SECONDS);// 主线程检查自己的ThreadLocal(应该是空的)System.out.println("主线程的消息列表: " + holder.get().messages);}
}

内部结构分析

根据这里get的源码追溯分析:

追溯到:

源码解析
/*** 获取当前线程的ThreadLocal变量值*/
public T get() {// 1. 获取当前线程对象Thread t = Thread.currentThread();// 2. 获取当前线程的ThreadLocalMap(线程私有数据存储结构)ThreadLocalMap map = getMap(t);// 3. 如果map已存在if (map != null) {// 3.1 以当前ThreadLocal实例为key(也就是代码中的holder),获取对应的EntryThreadLocalMap.Entry e = map.getEntry(this);// 3.2 如果Entry存在if (e != null) {// 3.2.1 强转为泛型类型并返回值@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}// 4. 如果map不存在或未找到值,初始化并返回默认值return setInitialValue();
}/*** 获取线程的ThreadLocalMap(实际是Thread类的threadLocals字段)*/
ThreadLocalMap getMap(Thread t) {return t.threadLocals; // 直接返回线程对象的成员变量
}/*** 初始化值并存入ThreadLocalMap*/
private T setInitialValue() {// 1. 获取初始值(子类可重写initialValue()方法)T value = initialValue();// 2. 获取当前线程Thread t = Thread.currentThread();// 3. 获取线程的ThreadLocalMapThreadLocalMap map = getMap(t);// 4. 如果map已存在,直接设置值if (map != null) {map.set(this, value);} else {// 5. 如果map不存在,创建新map并存入初始值createMap(t, value);}// 6. 返回初始值return value;
}/*** 创建线程的ThreadLocalMap并存入第一个值*/
void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);
}/*** 默认初始值实现(可被withInitial覆盖)*/
protected T initialValue() {return null; // 默认返回null
}
 图示详解

所以执行结果:

可以看见一个线程中只有一个信息,而不是它们统一堆砌在一起,原因就是底层是每个线程创建了一个Map对象,每个Map的value就是存入的messages本质是对象,也就是T--ThreadLocalTest对象们,并且它们Map中的Entry中的Key值都是一样的,都是这个ThreadLocal,也就是holder。

注】并不是每个线程的Map只能存放一个value对象,是这里我展示的例子里,一个线程只存了一条,完全可以存入很多条消息,然后add()时就会累加在Map已经创建好的Entry后面也就是:

当然既然是Map,存储Entry就涉及Hash了,这个以后再详谈。

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

相关文章:

  • 华为官方网站专卖店天堂网
  • 可以免费观看电影的网站sem推广软件
  • 网站开发融资计划宁波网站推广代运营
  • 做网站和app哪个难百度网址收录入口
  • 郑州做网站要多少钱百度免费推广平台
  • vi设计思路怎么写杭州网站seo优化
  • 长宁区网站建设网站制作爱站网长尾词挖掘
  • 有flash的网站网络运营推广是做什么的
  • 给别人做的网站涉及到诈骗商旅100网页版
  • 互联网保险的发展佛山旺道seo
  • 怎么免费做网站开源seo软件
  • 美橙智能网站外包推广公司
  • 上海市企业服务云网站优化设计卷子答案
  • 蚂蚁分类信息网站建设google seo怎么优化
  • 龙海市城乡规划建设局网站中国企业500强排行榜
  • 网站专题页面怎么做seo网站推广什么意思
  • 毕业设计网页设计论文乐陵市seo关键词优化
  • 网站挣钱方式宁波网络推广运营公司电话
  • 做暧在线观看网站网站建设是干什么的
  • 公司网站建设方面不足个人seo怎么赚钱
  • 邵阳做网站杭州seo网站推广排名
  • 深圳深圳龙岗网站建设东莞seo网络公司
  • 工业电商做网站怎么样网站推广的技术有哪些
  • 电子商务网站功能介绍发布推广信息的网站
  • 网站建设的目标和需求分析优化关键词排名seo软件
  • 连云港市建设工程质量监督站网站长沙网站优化价格
  • 怎样建微信公众号百度seo推广工具
  • 网站开发时间计划阳泉seo
  • 做网站要多少回扣希爱力双效片的作用与功效
  • wordpress修改背景苏州百度 seo