iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ThreadLocal工作原理及用法是什么
  • 664
分享到

ThreadLocal工作原理及用法是什么

2023-06-22 05:06:20 664人浏览 八月长安
摘要

今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ThreadLocal是什么ThreadLocal是线程Thread中属性

今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

ThreadLocal是什么

ThreadLocal是线程Thread中属性threadLocals即ThreadLocal.ThreadLocalMap的管理者,ThreadLocal用于给每个线程操作自己线程的本地变量,通过线程私有从而保证线程安全性。

ThreadLocal原理

get()方法来说,线程的本地变量是存放在线程实例的属性ThreadLocalMap上的,ThreadLocalMap本质上就是一个HashMap,ThreadLocal只是一个管理者,当我们的线程需要拿到自己的本地变量时,我们直接调用ThreadLocal去get本地变量即可。
因为get()方法底层会先获取到当前线程,然后通过当前线程拿到他的属性值ThreadLocalMap,如果ThreadLocalMap为空,则会调用ThreadLocal的初始化方法拿到初始值返回,如果不为空,则会拿该ThreadLocal作为key去获取该线程下的ThreadLocalMap里对应的value值。

ThreadLocal内存泄漏问题

线程的属性值ThreadLocalMap中使用的 key 为 ThreadLocal 的弱引用,而value是强引用。所以,如果ThreadLocal没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而value 不会被清理掉。这样的话,ThreadLocalMap 中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。
因此针对这种情况,我们有两种原则:

  • ThreadLocal申明为private static final。jdk建议ThreadLocal定义为private static,这样ThreadLocal的弱引用问题则不存在了。

    • private与final 尽可能不让他人修改变更引用。

    • static 表示为类属性,只有在程序结束才会被回收。

  • ThreadLocal使用后务必调用remove方法。

    • 最简单有效的方法是使用后将其移除。

关于InheritableThreadLocal

InheritableThreadLocal类是ThreadLocal类的子类。ThreadLocal中每个线程拥有它自己的值,与ThreadLocal不同的是,InheritableThreadLocal允许一个线程以及该线程创建的所有子线程都可以访问它保存的值。

代码示例

ThreadLocal使用

public class ThreadLocalTest {    //第一种初始化方式        private static final ThreadLocal<String> threadLocalStr = ThreadLocal.withInitial(() -> "fresh");    private static AtomicInteger intGen = new AtomicInteger(0);    //第二种初始化方式    private static final ThreadLocal<Integer> threadLocalInt = new ThreadLocal<Integer>() {        @Override        public Integer initialValue() {            return intGen.incrementAndGet();        }    };    public static void main(String[] args) throws InterruptedException {        ArrayList<Thread> threads = new ArrayList<>();        for (int i = 0; i < 2; i++) {            Thread t = new Thread(() -> {                try {                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalStr.get());                    TimeUnit.SECONDS.sleep(5);                    threadLocalStr.set("bojack horseman" + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalStr.get());                } catch (InterruptedException e) {                    e.printStackTrace();                } finally {                    threadLocalInt.remove();                    threadLocalStr.remove();                }            });            t.start();            threads.add(t);        }        TimeUnit.SECONDS.sleep(2);        System.out.println(threads);        System.out.println(threadLocalStr);        System.out.println(threadLocalInt);    }    }

InheritableThreadLocal使用

public class InheritableThreadLocalTest {    //第一种初始化方式    private static final InheritableThreadLocal<String> threadLocalStr = new InheritableThreadLocal<String>() {        @Override        public String initialValue() {            return "fresh";        }    };    private static AtomicInteger intGen = new AtomicInteger(0);    //第二种初始化方式    private static final ThreadLocal<Integer> threadLocalInt = new ThreadLocal<Integer>() {        @Override        public Integer initialValue() {            return intGen.incrementAndGet();        }    };    public static void main(String[] args) throws InterruptedException {        //如果是InheritableThreadLocal,则父线程创建的所有子线程都会复制一份父线程的线程变量,而不是去初始化一份线程变量        threadLocalStr.set("main");        ArrayList<Thread> threads = new ArrayList<>();        for (int i = 0; i < 2; i++) {            Thread t = new Thread(() -> {                try {                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalStr.get());                    TimeUnit.SECONDS.sleep(5);                    //子线程可以自由地改变自己的本地变量                    threadLocalStr.set("bojack horseman" + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalInt.get());                    System.out.println(Thread.currentThread().getName() + "   " + threadLocalStr.get());                } catch (InterruptedException e) {                    e.printStackTrace();                } finally {                    threadLocalInt.remove();                    threadLocalStr.remove();                }            });            t.start();            threads.add(t);        }        TimeUnit.SECONDS.sleep(2);        System.out.println(Thread.currentThread().getName() + "   " + threadLocalStr.get());    }    }

看完上述内容,你们对ThreadLocal工作原理及用法是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: ThreadLocal工作原理及用法是什么

本文链接: https://www.lsjlt.com/news/302733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ThreadLocal工作原理及用法是什么
    今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ThreadLocal是什么ThreadLocal是线程Thread中属性...
    99+
    2023-06-22
  • ThreadLocal工作原理及用法案例
    目录ThreadLocal是什么ThreadLocal原理ThreadLocal内存泄漏问题关于InheritableThreadLocal代码示例ThreadLocal使用Inhe...
    99+
    2024-04-02
  • Makefile及其工作原理是什么
    这篇文章给大家介绍Makefile及其工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当你需要在一些源文件改变后运行或更新一个任务时,通常会用到 make 工具。make 工具...
    99+
    2023-06-28
  • ThreadLocal的set方法原理是什么
    这篇文章主要介绍了ThreadLocal的set方法原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ThreadLocal的set方法原理是什么文章都会有所收获,下面我们一起来看看吧。前沿知识Threa...
    99+
    2023-07-05
  • Java中ThreadLocal的原理是什么及怎么使用
    这篇文章主要介绍“Java中ThreadLocal的原理是什么及怎么使用”,在日常操作中,相信很多人在Java中ThreadLocal的原理是什么及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
    99+
    2023-07-06
  • Java中ThreadLocal的用法和原理是什么
    这篇文章主要介绍“Java中ThreadLocal的用法和原理是什么”,在日常操作中,相信很多人在Java中ThreadLocal的用法和原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Th...
    99+
    2023-07-06
  • Ansible架构及工作原理是什么
    Ansible架构及工作原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH ...
    99+
    2023-06-19
  • mybatis工作原理及流程是什么
    MyBatis是一种持久层框架,它的工作原理及流程如下:1. 配置文件加载:MyBatis首先读取配置文件(通常是mybatis-c...
    99+
    2023-08-14
    mybatis
  • dnslog原理及工作流程是什么
    DNSlog是一种常用于渗透测试和恶意软件分析的技术,通过利用DNS协议的特性,实现收集和分析恶意软件的通信行为。DNSlog的工作...
    99+
    2023-09-25
    dnslog
  • Linux sed工具的使用及工作原理是什么
    本文小编为大家详细介绍“Linux sed工具的使用及工作原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux sed工具的使用及工作原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • Java内存的原型及工作原理是什么
    这篇文章给大家介绍Java内存的原型及工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要通过分析Java内存分配的栈、堆以以及常量池详细的讲解了其的工作原理。一、java虚拟机内存原型寄存器:我们在程序中...
    99+
    2023-06-17
  • nginx作用和工作原理是什么
    nginx是一种高性能的开源Web服务器和反向代理服务器。它可以用于处理静态和动态的HTTP、HTTPS、SMTP、POP3和IMA...
    99+
    2023-10-07
    nginx
  • Java中​HashMap的工作原理及实现方法是什么
    今天小编给大家分享一下Java中HashMap的工作原理及实现方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Has...
    99+
    2023-06-03
  • __autoload()方法的工作原理是什么
    __autoload()方法的工作原理是:1.类文件的文件名和类的名字保持一致。2.根据实例化的类的名称来查找这个类文件的路径。3.在实例化前没有引入这个类文件会自动执行。4.不用写很多个include或者require函数。__autol...
    99+
    2024-04-02
  • ZooKeeper工作原理是什么
    这篇文章主要介绍ZooKeeper工作原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ZooKeeper 是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等,。Z...
    99+
    2023-06-27
  • Casbin工作原理是什么
    Casbin工作原理Casbin通过配置文件来对访问控制模型进行配置,将一个访问控制的模型划分为PERM 的一个文件,切换或升级项目的授权机制与修改配置一样简单,您可以通过组合可用的模型来定制您自己的访问控制模型。...
    99+
    2024-04-02
  • jdbc工作原理是什么
    JDBC(Java Database Connectivity)是Java程序与数据库进行交互的一种标准接口。它定义了一组用于访问和...
    99+
    2023-08-31
    jdbc
  • Pinia工作原理是什么
    本篇内容介绍了“Pinia工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是PiniaPinia是Vue 3的状态管理库,它...
    99+
    2023-07-05
  • Ajax工作原理是什么
    本篇内容主要讲解“Ajax工作原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax工作原理是什么”吧!1、ajax技术的背景 不可否认,ajax技术...
    99+
    2024-04-02
  • MyBatis工作原理是什么
    这篇文章主要为大家展示了“MyBatis工作原理是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MyBatis工作原理是什么”这篇文章吧。MyBatis 的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作