您现在的位置是:首页 > 正文

线程数据共享和安全 -ThreadLocal

2024-01-30 22:45:58阅读 0

线程数据共享和安全 -ThreadLocal

1.什么是 ThreadLocal

  1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
  2. ThreadLocal 可以给当前线程关联一个数据(普通变量、 对象、 数组)set 方法 [源码!]
  3. ThreadLocal 可以像 Map 一样存取数据, key 为当前线程, get 方法
  4. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数 据, 就需要使用多个 ThreadLocal对象实例
  5. 每个 ThreadLocal 对象实例定义的时候, 一般为 static 类型
  6. ThreadLocal 中保存数据, 在线程销毁后, 会自动释放

ThreadLocal时序图

image-20220403160618777

2.快速入门ThreadLocal

T类

public class T {
    public static ThreadLocal threadLocal1 = new ThreadLocal();

    public static class MyThread implements Runnable{

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println("当前线程,"+name);
            /**
             *     public void set(T value) {
             *          //1.获取到当前线程
             *         Thread t = Thread.currentThread();
             *
             *         //2.将线程和ThradLocal进行关联
             *         //ThreadLocalMap是ThradLocal的静态内部类,Thread类中定义了 ThreadLocal.ThreadLocalMap threadLocals字段
             *         //getMap(t);===>  return t.threadLocals;对Thread的threadLocals进行了赋值
             *         ThreadLocalMap map = getMap(t);
             *
             *         //3.如果map不为空将threadloal最为key,传入的对象作为value存入到map中
             *         if (map != null)
             *             map.set(this, value);
             *         else
             *         //4.如果map为空则创建map并赋值
             *             createMap(t, value);
             *     }
             */
            threadLocal1.set(new Dog("一口", 2));
            new TService().update();
        }
    }

    public static void main(String[] args) {
        new Thread(new MyThread()).start();
    }
}

Dog

public class Dog {
    private String name;
    private Integer age;

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

TService

public class TService {

    public void update(){
        Thread thread = Thread.currentThread();
        System.out.println("当前线程,"+thread.getName());
        Object o = T.threadLocal1.get();
        System.out.println("TService 获取到对象="+o);
        new TDao().update();
    }
}

TDao

public class TDao {

    public void update() {
        Thread thread = Thread.currentThread();
        System.out.println("当前线程,"+thread.getName());
        Object o = T.threadLocal1.get();
        System.out.println("TDao 获取到对象="+o);

    }
}

测试结果

image-20220403161705040

Debug

image-20220403162134247

3.ThreadLocal 原理图

image-20220403164420460

网站文章

  • 【Android】App开发-动画效果篇

    【Android】App开发-动画效果篇

    在我们玩手机的过程中,如果我们点击某一个页面时,会出现一个页面动画加载或者动画效果的现象。现在我们就来看看App开发中是如何实现动画效果的。

    2024-01-30 22:45:53
  • map函数

    map函数 map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。我们...

    2024-01-30 22:45:45
  • RabbitMQ消息队列常见面试题总结

    RabbitMQ消息队列常见面试题总结

    RabbitMQ消息队列常见面试题总结;1、什么是消息队列?消息队列的优缺点?2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别?3、如何保证消息不被重复消费?4、如何保证消息不丢失,进行可靠性传输?5、如何保证消息的有序性?6、如何处理消息堆积情况?7、如何保证消息队列的高可用?

    2024-01-30 22:45:38
  • 一百二十、Kettle——从Hive全量导入到ClickHouse

    一百二十、Kettle——从Hive全量导入到ClickHouse

    用kettle把Hive数据同步到ClickHouse

    2024-01-30 22:45:09
  • 22.0 Pycharm中编写js代码

    22.0 Pycharm中编写js代码

    【代码】22.0 Pycharm中编写js代码。

    2024-01-30 22:45:03
  • 使用openpyxl玩转excel数据

    访问单元格的基本操作

    2024-01-30 22:44:55
  • Vue组件化之VueComponent介绍

    Vue组件化之VueComponent介绍

    简介这篇文章主要介绍的是VueComponent函数。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta ...

    2024-01-30 22:44:26
  • chatgpt赋能python:Python实现隐藏Excel列的方法

    chatgpt赋能python:Python实现隐藏Excel列的方法

    本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应...

    2024-01-30 22:44:22
  • mongodb分片部署

    mongodb分片部署

    1、mongodb分片科普 (各种罗嗦) Replica Set(副本集): 副本集使其组内的每个成员(member)在不同的mongod实例中具有相同的数据备份,这样可以将来自应用服务器的请求访问(request visit)得以均匀的分布在Replica Set的每一个成员所在的mongod实例上,用以减缓单台mongod服务器在请求负载上的压力。在一定时限内Replica Set能完成

    2024-01-30 22:44:15
  • 转录组助力HIV-1病毒感染机制研究新成果

    派森诺与中国人民解放军陆军军医大学&复旦大学携手合作,于近期在《Cellular & Molecular Immunology》上发表HIV-1 Vif通过靶向STING抑制抗病毒免疫的研究成果。研究...

    2024-01-30 22:43:44