java多线程学习之ThreadLocal

简介: java多线程学习之ThreadLocal

ThreadLocal介绍

并发程序最关键的一方面就是数据共享。当你创建了一个实现了Runable

ThreadLocal为每个使用它的线程提供单独的线程局部变量副本,每个线程都只能看到与自己关联的值,而不知道其他线程可能正在使用或者修改它们自己的副本。

ThreadLocal采用空间换时间的方式来解决线程安全问题。ThreadLocal会把共享变量复制一份到本地线程内存中,然后在自己的线程内对变量副本进行操作,各个线程只操作自己的变量副本而不影响其他线程的变量副本。


ThreadLocal 使用

代码一:

/**
 * @author Aaron
 * @Date 2019/4/16 21:42
 **/
public class ThreadLocalBean {
    private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 10;
        }
    };
    public Integer get(){
        return threadLocal.get();
    }
    public void set(){
        threadLocal.set(get() + 10);
    }
    public static void main(String[] args) {
        ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
        System.out.println(threadLocal.get());
    }
}

代码二:

/**
 * @author Aaron
 * @Date 2019/4/15 16:40
 **/
public class ThreadLocalDemo {
    public static void main(String[] args) {
        ThreadLocalBean bean = new ThreadLocalBean();
        TempThread tempThread1 = new TempThread(bean);
        TempThread tempThread2 = new TempThread(bean);
        Thread thread1 = new Thread(tempThread1 , "thread1");
        Thread thread2 = new Thread(tempThread2 , "thread2");
        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("bean value:"+bean.get());
    }
    static class TempThread implements Runnable{
        ThreadLocalBean bean;
        public TempThread(ThreadLocalBean bean){
            this.bean = bean;
        }
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                bean.set();
            }
            System.out.println(Thread.currentThread().getName()+"---"+bean.get());
        }
    }
}
运行结果
thread2---60
thread1---60
bean value:10

从运行结果我们发现,在thread2和thread1分别调用同一个ThreadLocalBean 的set()方法,两者的运行结果相同并且互不影响,同时这两线程对bean的操作也没有影响到bean的ThreadLocal里的值。

ThreadLocal使用场景

当你在做一个电商应用的时候,你有一个需求是为每个用户访问controller时生成一个唯一的事务ID,并且为了登录需要把这个事务ID传给业务逻辑层。一个解决方案就是把事务ID传给所有业务方法,这样的话代码就是变得冗余也没必要这样。

为了解决这个,你可以使用ThreadLocal局部变量。你可以在controller 或者预处理拦截器中生成一个事务ID,然后把它设置到ThreadLocal变量里面,之后不管什么方法调用controller里面方法,它们都能够从ThreadLocal获取到事务ID。这样controller将会处理更多的请求,并且每个请求在框架层面都是互相隔离的,事务id对每个线程都是惟一的,并且可以从线程的所有执行路径访问它


目录
相关文章
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
3天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
1天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
4天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
19 4
|
4天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
24 3
|
5天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
17 1
|
9天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
17 3
|
9天前
|
缓存 安全 Java
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文将深入探讨Java中的多线程编程,包括其基本原理、实现方式以及常见问题。我们将从简单的线程创建开始,逐步深入了解线程的生命周期、同步机制、并发工具类等高级主题。通过实际案例和代码示例,帮助读者掌握多线程编程的核心概念和技术,提高程序的性能和可靠性。
10 2
|
6月前
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
85 1
|
6月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法