ThreadLocal使用

Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。

package com.zhuyang.concurrency.threadlocal;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadLocalTest2 extends Thread {
	private static int num = 0;
private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();
private static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
	@Override
	public void run() {
		int num = new Random().nextInt();
		System.out.println(Thread.currentThread().getName() + " has put data, data=" + num);
		threadData.put(Thread.currentThread(), num);
		threadLocal.set(num);
		new A().getNum();
		new B().getNum();
	}

	public static void main(String[] args) {
		for(int i=0;i<2;i++){
			ThreadLocalTest2 thread = new ThreadLocalTest2();
			thread.start();
		}
		
	}

	static class A {
		public void getNum() {
			int dataFromMap = threadData.get(Thread.currentThread());
			int dataFromThreadLocal = threadLocal.get();
			System.out.println("A Thread " + Thread.currentThread().getName() + " has put data, dataFromMap=" + dataFromMap+",dataFromThreadLocal="+dataFromThreadLocal);
		}
	}

	static class B {
		public void getNum() {
			int dataFromMap = threadData.get(Thread.currentThread());
			int dataFromThreadLocal = threadLocal.get();
			System.out.println("B Thread " + Thread.currentThread().getName() + " has put data, dataFromMap=" + dataFromMap+",dataFromThreadLocal="+dataFromThreadLocal);
		}
	}
}
执行结果:
Thread-1 has put data, data=-9946002
Thread-0 has put data, data=1910168837
A Thread Thread-1 has put data, dataFromMap=-9946002,dataFromThreadLocal=-9946002
A Thread Thread-0 has put data, dataFromMap=1910168837,dataFromThreadLocal=1910168837
B Thread Thread-0 has put data, dataFromMap=1910168837,dataFromThreadLocal=1910168837
B Thread Thread-1 has put data, dataFromMap=-9946002,dataFromThreadLocal=-9946002

结果能看出两个线程之间并不会共享数据。

源码分析:

public void set(T value) {
        Thread t = Thread.currentThread();//获得当前线程
        ThreadLocalMap map = getMap(t);   //获取当前线程的本地变量MAP 
        if (map != null)
            map.set(this, value);//map不为空则塞值,key为当前线程,value为值
        else
            createMap(t, value);//创建线程 t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

public T get() {
        Thread t = Thread.currentThread();//获得当前线程
        ThreadLocalMap map = getMap(t);//获取当前线程的本地变量MAP 
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);//如果不为空,获得entry
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();//创建map
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
ThreadLocal是一个Java类,用于在多线程环境下保存线程本地变量的副本。通过创建ThreadLocal对象,每个线程都可以拥有自己独立的变量副本,互不干扰。 使用ThreadLocal的过程如下: 1. 创建一个ThreadLocal对象,可以指定泛型类型。 2. 在每个线程,通过ThreadLocal对象的`get()`方法获取当前线程的变量副本。如果当前线程没有设置过变量值,则会使用默认值进行初始化。 3. 在每个线程,通过ThreadLocal对象的`set(value)`方法设置当前线程的变量值。 4. 在每个线程,通过ThreadLocal对象的`remove()`方法移除当前线程的变量副本。 需要注意的是,ThreadLocal对象的生命周期与Thread对象的生命周期一样长。当ThreadLocal对象被垃圾回收时,关联的变量副本也会被回收。 在ThreadLocal内部,使用ThreadLocalMap来存储每个线程的变量副本。ThreadLocal的实例作为key,变量值作为value。ThreadLocalMap可以使用强引用或弱引用来引用ThreadLocal对象。如果使用强引用,当ThreadLocal对象被回收时,如果没有手动删除对应的变量副本,会导致内存泄漏。如果使用弱引用,当ThreadLocal对象被回收时,对应的变量副本也会被回收。 总结来说,ThreadLocal是一种线程本地变量,通过保存每个线程的变量副本,实现了多线程环境下的线程隔离。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ThreadLocal使用与原理](https://blog.csdn.net/qq_35190492/article/details/116431270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ThreadLocal使用详解](https://blog.csdn.net/LJJZJ/article/details/88763666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值