首页 > 编程语言 >[Java并发包学习七]解密ThreadLocal

[Java并发包学习七]解密ThreadLocal

时间:2023-04-18 16:31:56浏览次数:38  
标签:公交 code Java 变量 ThreadLocal 线程 发包 多线程


相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!

看看JDK中的源码是怎么写的:

This class provides thread-local variables. These variables differ from

their normal counterparts in that each thread that accesses one (via its

{@code get} or {@code set} method) has its own, independently initialized

copy of the variable. {@code ThreadLocal} instances are typically private

static fields in classes that wish to associate state with a thread (e.g.,

a user ID or Transaction ID).

 

翻译过来大概是这样的(英文不好,如有更好的翻译,请留言说明):

 

ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。

 

可以总结为一句话:ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。

举个例子,我出门需要先坐公交再做地铁,这里的坐公交和坐地铁就好比是同一个线程内的两个函数,我就是一个线程,我要完成这两个函数都需要同一个东西:公交卡(北京公交和地铁都使用公交卡),那么我为了不向这两个函数都传递公交卡这个变量(相当于不是一直带着公交卡上路),我可以这么做:将公交卡事先交给一个机构,当我需要刷卡的时候再向这个机构要公交卡(当然每次拿的都是同一张公交卡)。这样就能达到只要是我(同一个线程)需要公交卡,何时何地都能向这个机构要的目的。

 

有人要说了:你可以将公交卡设置为全局变量啊,这样不是也能何时何地都能取公交卡吗?但是如果有很多个人(很多个线程)呢?大家可不能都使用同一张公交卡吧(我们假设公交卡是实名认证的),这样不就乱套了嘛。现在明白了吧?这就是ThreadLocal设计的初衷:提供线程内部的局部变量,在本线程内随时随地可取,隔离其他线程。

标签:公交,code,Java,变量,ThreadLocal,线程,发包,多线程
From: https://blog.51cto.com/u_16077609/6203668

相关文章

  • Java中实现String字符串用逗号隔开
    publicstaticvoidmain(String[]args)throwsException{ StringstrText="421542"; Stringinformation=""; intstart=0; intend=1; Stringdigit=""; intcount=strText.length(); for(inti=......
  • 一个Java线程的线生(线生 vs 人生)
    java线程的使用1.Java多线程概述下面我们看下Java的多线程作者:博学谷狂野架构师GitHub:GitHub地址(有我精心准备的130本电子书PDF)只分享干货、不吹水,让我们一起加油!......
  • Java文件下载代码及中文文件名不显示的问题
    @GetMapping("/downloadOrderDemo")publicResponseEntity<Resource>downloadFile()throwsIOException{//读取文件内容Filefile=newFile(System.getProperty("user.dir")+File.separator+"work-order/src/main/......
  • Java Web实现文件上传下载功能实例解析
    ​ 第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName= null;Stringnewpathname= null;StringfileAddre= "/numUp";try{    InputStreamstream=file.getInputStream();// 把文件读入    StringfilePath=request.......
  • jmeter取样器javaRequest脚本8
    1,创建一个maven工程2,通过maven编译打包生成一个jar包3,重启jmeter,新建javarequest请求4,开始执行脚本本文永久更新地址:1,创建一个maven工程在pom.xml文件中添加maven下载地址:https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_java/5.4.1<depe......
  • javassist 报错 ; is missing
    在通过javassist编写的时候,主要代码如下:Stringcode="for(Stringaa:tt){....}";启动后报 Exceptioninthread"main"javassist.CannotCompileException:[sourceerror];ismissingatjavassist.CtNewMethod.make(CtNewMethod.java:84)atjava......
  • Mybatis 批量更新(foreach成多条sql) 为什么比 java 中反复执行单条插入语句效率高?
    使用MyBatis的批量更新功能可能比逐行更新更高效。使用批量更新可以将多个更新操作合并为一个批处理操作,并将所有操作发送给数据库一次(只需建立一次连接),从而减少了数据库的IO操作和网络开销,提高了系统的性能。mybatis批量更新的方法:https://cloud.tencent.com/developer/arti......
  • Java集合框架Collection接口
    Collection接口概念Java集合框架是Java编程中的一个非常重要的部分,提供了一组用于处理数据集合的接口和类。其中Collection接口是Java集合框架的基础接口之一,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等。在这里,我将为您详细介绍Java集合框架中的Collection接口。......
  • Java:ArrayList初始化赋值
    测试环境$java-versionjavaversion"1.8.0_251"Java(TM)SERuntimeEnvironment(build1.8.0_251-b08)JavaHotSpot(TM)64-BitServerVM(build25.251-b08,mixedmode)方式一:常规方式List<Integer>list=newArrayList<>();list.add(1);list......
  • invalid comparison: java.util.ArrayList and java.lang.String 异常分析及解决方法
    nvalidcomparison:java.util.ArrayListandjava.lang.String异常解决方法异常原因首先我们可以确定是在mybatis的xml中的list操作出现错误然后发现在接收list的时候加了判断list!=’’,导致list(数组集合类型)和空字符串(字符串类型)进行比较,故报错解决办法,对于list类型进......