返回顶部
首页 > 资讯 > 后端开发 > Python >ThreadLocal工作原理及用法案例
  • 677
分享到

ThreadLocal工作原理及用法案例

2024-04-02 19:04:59 677人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录ThreadLocal是什么ThreadLocal原理ThreadLocal内存泄漏问题关于InheritableThreadLocal代码示例ThreadLocal使用Inhe

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://lsjlt.com/news/160832.html(转载时请注明来源链接)

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

猜你喜欢
  • ThreadLocal工作原理及用法案例
    目录ThreadLocal是什么ThreadLocal原理ThreadLocal内存泄漏问题关于InheritableThreadLocal代码示例ThreadLocal使用Inhe...
    99+
    2024-04-02
  • ThreadLocal工作原理及用法是什么
    今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ThreadLocal是什么ThreadLocal是线程Thread中属性...
    99+
    2023-06-22
  • Java ThreadLocal原理解析以及应用场景分析案例详解
    目录ThreadLocal的定义ThreadLocal的应用场景ThreadLocal的demoTheadLocal的源码解析ThreadLocal的set方法ThreadLocal...
    99+
    2024-04-02
  • ThreadLocal作用原理与内存泄露示例解析
    目录ThreadLocal作用简单例子局部变量、成员变量 、 ThreadLocal、静态变量共享 or 隔离原理源码分析TheadLocalTheadLocalMapThreadL...
    99+
    2024-04-02
  • ThreadLocal原理介绍及应用场景
    本次给大家介绍重要的工具ThreadLocal。讲解内容如下,同时介绍什么场景下发生内存泄漏,如何复现内存泄漏,如何正确使用它来避免内存泄漏。 ThreadLocal是什么...
    99+
    2024-04-02
  • redux工作原理讲解及使用方法
    目录1. redux 是什么?2.redux的原理3. 如何使用 redux?(1).安装redux,创建redux文件夹,建立store.js(2).建立reducers.js(3...
    99+
    2024-04-02
  • Gateway网关工作原理及使用方法
    目录1. 什么是 API 网关(API Gateway)分布式服务架构、微服务架构与 API 网关API 网关的定义API 网关的职能API 网关的分类与功能2. Gateway是什...
    99+
    2024-04-02
  • Linux sed工具的使用及工作原理
    目录基础知识sed编辑器: Stream Editor工作原理:sed的基本用法sed的命令格式sed实现自动打印功能(最基本用法)sed选项sed的脚本格式sed脚本的地址格式sed脚本的指令范例sed工具的核心用法:...
    99+
    2022-07-12
    Linux sed工具 Linux sed工具使用
  • Linux sed工具的使用及工作原理
    目录基础知识sed编辑器: Stream Editor工作原理:sed的基本用法sed的命令格式sed实现自动打印功能(最基本用法)sed选项sed的脚本格式sed脚本的地址格式se...
    99+
    2024-04-02
  • Linux NFS机制工作原理及实例解析
    什么是NFS? network file system 网络文件系统 通过网络存储和组织文件的一种方法或机制。 为什么要用NFS? 前端所有的应用服务器接收到用户上传的图片、文件、视频,都会统一放到后...
    99+
    2022-06-03
    Linux NFS机制
  • Linux NFS机制工作原理及实例分析
    Linux NFS机制工作原理及实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。NFS是network file system (网络文件系统)的缩写,其主要作用就是通过...
    99+
    2023-06-28
  • JWT构成及工作原理
    什么是JWT? JWT(json web token),它并不是一个具体的技术实现,而更像是一种标准。 JWT规定了数据传输的结构,一串完整的JWT由三段落组成,每个段落用英文句号连...
    99+
    2024-04-02
  • Ajax工作原理及优缺点的示例分析
    这篇文章将为大家详细讲解有关Ajax工作原理及优缺点的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.Ajax是什么?全称是 asynchronous javascript and xml,是已...
    99+
    2023-06-08
  • redis工作原理及其优点
    这篇文章将为大家详细讲解有关redis工作原理及其优点,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。redis工作原理redis是一个key-value存储...
    99+
    2024-04-02
  • Java中ThreadLocal的用法和原理详解
    目录用法实现原理内存泄漏用法 隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。 package com.exam...
    99+
    2023-05-15
    Java ThreadLocal用法 Java ThreadLocal原理 Java ThreadLocal
  • 一文理解Redux及其工作原理
    目录一、是什么二、工作原理三、如何使用小结一、是什么 React是用于构建用户界面的,帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件,每个组件的state是由自身进行管...
    99+
    2024-04-02
  • CSS中placeholder-shown的工作原理及应用
    这篇文章主要讲解了“CSS中placeholder-shown的工作原理及应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS中placeholder-...
    99+
    2024-04-02
  • Linux sed工具的使用及工作原理是什么
    本文小编为大家详细介绍“Linux sed工具的使用及工作原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux sed工具的使用及工作原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • ThreadLocal原理分析及应用场景是怎样的
    本篇文章给大家分享的是有关ThreadLocal原理分析及应用场景是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. ThreadLocal是什么?有哪些用途?首先介绍...
    99+
    2023-06-22
  • Java中ThreadLocal的原理是什么及怎么使用
    这篇文章主要介绍“Java中ThreadLocal的原理是什么及怎么使用”,在日常操作中,相信很多人在Java中ThreadLocal的原理是什么及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作