首页 > 编程语言 >java ThreadLocal做线程隔离

java ThreadLocal做线程隔离

时间:2024-09-02 20:52:09浏览次数:12  
标签:副本 java 变量 Thread threadLocalValue ThreadLocal 线程

`ThreadLocal`类提供了线程局部变量,每个线程都可以独立地访问自己的变量副本,而不会影响其他线程的副本。这在多线程环境中非常有用,可以避免线程间的数据共享和竞争条件,提高程序的线程安全性。

### ThreadLocal的用法:
1. **创建ThreadLocal对象**:首先需要创建一个`ThreadLocal`对象,指定泛型类型为要存储的变量类型。
2. **设置和获取值**:通过`set()`方法设置当前线程的变量副本,通过`get()`方法获取当前线程的变量副本。
3. **移除值**:通过`remove()`方法移除当前线程的变量副本,清理资源,避免内存泄漏。

### ThreadLocal示例:
```java
public class ThreadLocalExample {
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        // 设置值到ThreadLocal
        threadLocalValue.set(42);

        // 在不同线程中访问ThreadLocal
        Thread thread1 = new Thread(() -> {
            threadLocalValue.set(10);
            System.out.println("Thread 1: " + threadLocalValue.get());
        });

        Thread thread2 = new Thread(() -> {
            threadLocalValue.set(20);
            System.out.println("Thread 2: " + threadLocalValue.get());
        });

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

        // 主线程访问ThreadLocal
        System.out.println("Main Thread: " + threadLocalValue.get());

        // 清除ThreadLocal值
        threadLocalValue.remove();
    }
}
```

在这个示例中,`ThreadLocalExample`类演示了`ThreadLocal`的基本用法。每个线程可以独立地设置和获取`ThreadLocal`变量的值,而不会相互影响。在主线程和不同线程中可以存储不同的值,保证了线程之间的数据隔离。最后,通过`remove()`方法清除线程的`ThreadLocal`值,释放资源。

这样,`ThreadLocal`为多线程环境提供了一种简单而有效的方式来维护线程局部变量,避免了共享变量带来的线程安全问题。

标签:副本,java,变量,Thread,threadLocalValue,ThreadLocal,线程
From: https://blog.csdn.net/weixin_37841024/article/details/141829964

相关文章

  • java并发 第四章共享模型之管程 3 synchronized 原理
    1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是synchronized假设有两个方法同步块,利用同一个对象加锁 staticfinalObjectobj=newObject();......
  • 浙江省住房和城乡建设行业继续教育刷课脚本-JavaScript编写
    脚本学习网站:https://zj.zjjsrc.cn/web/web_toUserSignUp.page脚本地址:浙江省住房和城乡建设行业专业技术人员继续教育-刷课脚本:https://greasyfork.org/zh-CN/scripts/506406-浙江省住房和城乡建设行业专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器......
  • 浙江省建设人才远程继续教育平台刷课脚本-JavaScript编写
    脚本学习网站:https://zj.zjjsrc.cn/web/web_toUserSignUp.page脚本地址:浙江省建设人才远程继续教育平台刷课脚本:https://greasyfork.org/zh-CN/scripts/506406-浙江省住房和城乡建设行业专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间......
  • 深入理解HTTP连接池及其在Java中的应用
    更多内容前往个人网站:孔乙己大叔        在现代的Web开发中,HTTP请求已经成为应用程序与外部服务交互的主要方式。随着微服务架构的流行,一个应用可能需要同时与多个外部服务进行通信,这导致HTTP请求的数量显著增加。为了提升性能和资源利用率,HTTP连接池成为了一个不可......
  • 【网络安全 | Java代码审计】Code-Breaking Puzzles-javacon
    未经许可,不得转载。源码:https://www.leavesongs.com/media/attachment/2018/11/23/challenge-0.0.1-SNAPSHOT.jar,下载至桌面。考察知识点:SpEL注入正文执行命令运行环境:java-jarC:\Users\86177\Desktop\challenge-0.0.1-SNAPSHOT.jar浏览器访问localhost:8080使用JD-......
  • Java生产环境下性能监控与调优指南
    Java生产环境下性能监控与调优指南目录引言Java性能监控2.1性能监控工具2.2关键性能指标Java应用性能调优3.1内存调优3.2垃圾回收调优3.3多线程优化3.4数据库连接优化3.5代码级优化结语1.引言在Java应用的生产环境下,性能监控及调优显得至关重要,它们......
  • Java线程生命周期:Java线程生命周期全景解读
    1.线程生命周期概述:不仅仅是状态转换在多线程编程中,理解线程的生命周期对于编写有效、高效的代码至关重要。线程生命周期通常描述了线程从创建到死亡的一系列状态变化过程,但其实不仅仅局限于这些状态的简单转换。线程生命周期的理解应该考虑系统资源的分配、线程调度、同步、通信......
  • JAVA基础:对象流
    目录前言序列化和反序列化对象流的创建前言之前的流我们都是使用他们读取一些字节或者字符的数据,但是在实际的应用中数据的类型除了基本数据类型之外,还有引用数据类型,对象流就是能读取引用数据类型的流序列化和反序列化对象流的本质是一个字节流,也是过程流对象流的......
  • Java小白一文讲清Java中集合相关的知识点(二)
    ListList接口和常用方法基本介绍List接口是Collection接口的子接口List集合类中的元素有序–即添加顺序和取出顺序一致、且可重复publicclassJourney{@SuppressWarnings({"all"})publicstaticvoidmain(String[]args){Listlist=newArray......
  • 【Java 基础】类和对象(构造&this&封装&static&代码块)
    ✨                           风起于青萍之末,浪成于微澜之间    ......