【多线程】ThreadLocal 作为类的私有静态字段实践

news2024/11/23 20:25:52

在这里插入图片描述

ThreadLocal 通常作为类的私有静态字段存在的主要原因是为了确保每个线程都能够拥有自己独立的 ThreadLocal 变量。
以下是一些原因:

  • 线程隔离: ThreadLocal 的设计目的是为了实现线程隔离,即每个线程都可以独立地管理自己的变量,互不影响。将 ThreadLocal 设计为类的私有静态字段可以确保在同一类中的所有实例共享相同的 ThreadLocal,但不同类之间的实例不共享。
  • 访问控制: 类的私有静态字段使得访问 ThreadLocal 的权限受到限制,只有该类内部的方法可以直接访问它。这有助于维持对 ThreadLocal 的封装,防止外部类直接访问和修改 ThreadLocal。
  • 类加载时初始化: 将 ThreadLocal 定义为类的私有静态字段,可以确保 ThreadLocal 在类加载时进行初始化。这样,每个线程首次访问该 ThreadLocal 时,都能够获得一个初始值,而不需要显式地在代码中进行初始化。

示例代码一:

public class Example {
    // ThreadLocal作为类的私有静态字段
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        // 在不同线程中访问同一个ThreadLocal变量
        Thread thread1 = new Thread(() -> {
            threadLocal.set("Thread 1");
            System.out.println(threadLocal.get()); // 输出 "Thread 1"
        });

        Thread thread2 = new Thread(() -> {
            threadLocal.set("Thread 2");
            System.out.println(threadLocal.get()); // 输出 "Thread 2"
        });

        thread1.start();
        thread2.start();
    }
}

在上述示例中,threadLocal 是类的私有静态字段,确保了不同线程访问的是同一个 ThreadLocal 变量,但每个线程都能够拥有自己独立的值。

示例代码二:

public class ThreadLocalExample {

    // 定义一个 ThreadLocal 变量
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        // 创建并启动两个线程
        Thread thread1 = new Thread(() -> {
            // 在线程1中设置 ThreadLocal 变量的值
            threadLocal.set("Value set in Thread 1");
            // 调用方法展示 ThreadLocal 的值
            displayValues("Thread 1");
        });

        Thread thread2 = new Thread(() -> {
            // 在线程2中设置 ThreadLocal 变量的值
            threadLocal.set("Value set in Thread 2");
            // 调用方法展示 ThreadLocal 的值
            displayValues("Thread 2");
        });

        // 启动两个线程
        thread1.start();
        thread2.start();

        // 主线程设置 ThreadLocal 变量的值
        threadLocal.set("Value set in Main Thread");
        // 主线程调用方法展示 ThreadLocal 的值
        displayValues("Main Thread");
    }

    // 方法用于展示当前线程中的 ThreadLocal 变量的值
    private static void displayValues(String threadName) {
        // 获取 ThreadLocal 变量的值
        String value = threadLocal.get();
        System.out.println(threadName + " - ThreadLocal value: " + value);
        // 清除 ThreadLocal 变量,防止内存泄漏
        threadLocal.remove();
    }
}

在这个例子中,ThreadLocalExample 类中定义了一个 ThreadLocal 变量 threadLocal,然后创建了两个线程 thread1 和 thread2,以及主线程。每个线程都通过 threadLocal.set() 设置了不同的值,并通过调用 displayValues 方法展示了当前线程中 ThreadLocal 变量的值。值得注意的是,在每个线程完成后,使用 threadLocal.remove() 清除了 ThreadLocal 变量,以防止内存泄漏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1415877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为机考入门python3--(3)牛客3-明明的随机数

分类&#xff1a;集合、排序 知识点&#xff1a; 集合添加元素 set.add(element) 集合转列表 list(set) 列表排序 list.sort() 题目来自【牛客】 N int(input().strip()) nums set()for i in range(N):nums.add(int(input().strip()))# 集合转列表 nums_list l…

3 JS类型 值和变量

计算机对value进行操作。 value有不同的类型。每种语言都有其自身的类型集合。编程语言的类型集是该编程语言的基本特性。 value需要保存一个变量中。 变量的工作机制是变成语言的另一个基本特性。 3.1概述和定义 JS类型分为&#xff1a; 原始类型和对象类型。 原始类型&am…

最高20倍!压缩ChatGPT等模型文本提示,极大节省AI算力

最高20倍&#xff01;压缩ChatGPT等模型文本提示&#xff0c;极大节省AI算力_信息_段落_问题 在长文本场景中&#xff0c;ChatGPT 等大语言模型经常面临更高算力成本、更长的延迟以及更差的性能。为了解决这三大难题&#xff0c;微软开源了 LongLLMLingua。 据悉&#xff0c;L…

如何在docker容器中安装Elasticsearch中的IK分词器

目录 &#xff08;1&#xff09;准备IK分词器的压缩包 &#xff08;2&#xff09;进入docker容器 &#xff08;3&#xff09;移动ik分词器到指定文件夹 &#xff08;4&#xff09;解压分词器压缩包 &#xff08;5&#xff09;测试IK分词器是否安装成功 &#xff08;1&#…

【Image captioning】论文阅读八—ClipCap: CLIP Prefix for Image Captioning_2021

中文标题&#xff1a;ClipCap: CLIP前缀用于图像描述&#xff08;ClipCap: CLIP Prefix for Image Captioning&#xff09; 文章目录 1. 介绍2. 相关工作3. 方法3.1 综述3.2 语言模型微调3.3 映射网络架构3.4 推理 4. 结果5. 结论 摘要&#xff1a;图像描述是视觉语言理解中的…

C语言——操作符详解2

目录 0.过渡0.1 不创建临时变量&#xff0c;交换两数0.2 求整数转成二进制后1的总数 1.单目表达式2. 逗号表达式3. 下标访问[ ]、函数调用( )3.1 下标访问[ ]3.2 函数调用( ) 4. 结构体成员访问操作符4.1 结构体4.1.1 结构体的申明4.1.2 结构体变量的定义和初始化 4.2 结构体成…

SpringBoot 配置类解析

全局流程解析 配置类解析入口 postProcessBeanDefinitionRegistry逻辑 processConfigBeanDefinitions逻辑 执行逻辑解析 执行入口 ConfigurationClassPostProcessor.processConfigBeanDefinitions()方法中的do while循环体中 循环体逻辑 parse方法调用链 doProcessConfigurat…

【C++中STL】list链表

List链表 基本概念构造函数赋值和交换大小操作插入和删除数据存取反转和排序 基本概念 将数据进行链式存储 链表list是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff0c;链表是由一系列结点组成&#xff0c;结点的组…

Android studio环境搭建过程异常

异常&#xff1a;Connect timed out 创建新项目时&#xff0c;提示time out 解决方案&#xff1a;修改gradle下载地址&#xff0c;使用国内镜像地址 distributionUrlhttps\://services.gradle.org/distributions/gradle-8.2-bin.zip修改成distributionUrlhttps\://mirrors.c…

fatal error:require():Failed opening required

今天部署网站遇到了个错误 fatal error:require():Failed opening required 这个错误经常遇到 大多是网站 是开启了 open_basedir 但今天这个错误很神奇 先说解决方法 1. 检测一下是不是真的 不存在这个文件 即使100%确定 也建议你再仔细看一下 这个文件存不存在 今天我遇…

日常学习之:如何使用 dockerfile 将 vue 的单独前端项目通过 docker 的方式部署到 heroku上

文章目录 需求描述开始操作准备阶段&#xff1a;准备 server.js 文件并安装依赖&#xff0c;将 vue 项目包装成单独的服务器制作 server.js安装 server.js 需要的依赖 构建 Dockerfileheroku container 链接和部署其他细节 需求描述 你想用 vue 构建前端&#xff0c;用 django…

终端录屏神器Asciinema慎用教程

1.效果 2.安装 centos yum install asciinema ubuntu apt-get install asciinema 3.使用 asciinema rec kali.cast #录制文件 asciinema play kali.cast #播放文件 asciinema upload kali.cast #上传文件 详细说明:只使用 asciinema rec 也是可以的,ctrlD结束录屏 4.…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后&#xff0c;进行深入分析&#xff0c;建议收藏&#xff1b; 2、本专栏对2023年赛题&#xff0c;其它题目分析详见专题讨论&#xff1b; 2023年数学建模美赛A题&#xff08;A drought stricken plant communi…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能&#xff1a; 不同助教服务类型选择 助教申请&#xff0c;接单&#xff0c;陪练师入住&#xff0c;赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈&#xff1a;前端uniapp后端thinkphp 独立全开源

Redis 的二进制安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 Redis 简介二进制编译安装获取源码包编译安装移动配置文件到安装目录下配置 redis 为后台启动将 redis 加入到开机启动设置 redis 密码 (可选)修改 bind启动 redis apt 安装更换阿里源(可选)安装 redis修改配置文件 Redis 简介 Redis&#xff08;全称为Remot…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态&#xff1a; channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…

1.26学习总结

连通性判断 DFS连通性判断步骤&#xff1a; 1.从图上任意一点u开始遍历&#xff0c;标记u已经走过 2.递归u的所有符合连通条件的邻居点 3.递归结束&#xff0c;找到了的所有与u的连通点&#xff0c;就是一个连通块 4.然后重复这个步骤找到所有的连通块 BFS连通性判断步骤…

opencv学习二值分析

内容来源于《opencv4应用开发入门、进阶与工程化实践》 二值分析&#xff1a; 常见的二值化方法&#xff1a; 基于全局阈值&#xff08;threshold&#xff09;得到的二值图像&#xff1b;基于自适应阈值&#xff08;adaptiveThreshold&#xff09;得到的二值图像&#xff1…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体&#xff09;这种就解决不了&#xff0c;也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中&#xff0c;客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了&#xff0c;主要是因为硕士之后&#xff0c;也就没再继续深入研究这个课题了&#xff0c;更多的是在电科院的项目里会接触。这个课题方向其实作为硕士毕业课题还是够用的&#xff0c;相对来说也是比较容易毕业的&#xff0c;因为涉及的…