码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JavaWeb ThreadLocal 的使用


    ThreadLocal 的使用

            ThreadLocal 的作用,它可以解决多线程的数据安全问题。
            ThreadLocal 它可以给当前线程关联一个数据(可以是普通变量,可以是对象,也可以是数组,集合)
    ThreadLocal 的特点:
                    1、ThreadLocal 可以为当前线程关联一个数据。(它可以像 Map 一样存取数据,key 为当前线程)
                    2、每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal 对象实例。
                    3、每个 ThreadLocal 对象实例定义的时候,一般都是 static 类型
                    4、ThreadLocal 中保存数据,在线程销毁后。会由 JVM 虚拟自动释放。

    可以通过ThreadLocal获取每一个线程中保存的数据

    步骤

            1.重写run方法,随机生成一个数据,用Map集合保存,key为线程名,value为随机生成的数据

            2.创建线程

            3. 在其他类中获取每个当前线程里的所保存的数据

     方式一:使用Hashtable集合

    1. public class ThreadLocalTest1 {
    2. // 创建线程安全的map集合
    3. public static Map data = new ConcurrentHashMap<>();
    4. // 创建一个随机类对象
    5. private static Random random = new Random();
    6. // 编写线程
    7. public static class Task implements Runnable {
    8. @Override
    9. public void run() {
    10. // 在 Run 方法中,随机生成一个变量(线程要关联的数据),然后以当前线程名为 key 保存到 map 中
    11. Integer i = random.nextInt(1000);// 随机生成1-999的数字
    12. // 获取当前线程名
    13. String name = Thread.currentThread().getName();
    14. System.out.println("线程[" + name + "]生成的数是:" + i);
    15. data.put(name, i);
    16. try {
    17. Thread.sleep(3000);
    18. } catch (InterruptedException e) {
    19. throw new RuntimeException(e);
    20. }
    21. new Test().test();
    22. // 在 Run 方法结束之前,以当前线程名获取出数据并打印。查看是否可以取出操作
    23. Object o = data.get(name);
    24. System.out.println("在线程["+name+"]快结束时取出关联的数据是:" + o);
    25. }
    26. }
    27. public static void main(String[] args) {
    28. // 创建线程
    29. for (int i = 0; i < 3; i++) {
    30. new Thread(new Task()).start();
    31. }
    32. }
    33. }
    34. public class Test {
    35. public void test() {
    36. String name = Thread.currentThread().getName();
    37. System.out.println("Test 当前线程[" + name + "]中保存的数据是:"
    38. + ThreadLocalTest1.data.get(name));
    39. }
    40. }

    结果:

     

    方式二:使用ThreadLocal

    1. public class ThreadLocalTest2 {
    2. // 创建线程安全的map集合
    3. public static ThreadLocal threadLoad = new ThreadLocal<>();
    4. // 创建一个随机类对象
    5. private static Random random = new Random();
    6. // 编写线程
    7. public static class Task implements Runnable {
    8. @Override
    9. public void run() {
    10. // 在 Run 方法中,随机生成一个变量(线程要关联的数据),然后以当前线程名为 key 保存到 map 中
    11. Integer i = random.nextInt(1000);// 随机生成1-999的数字
    12. // 获取当前线程名
    13. String name = Thread.currentThread().getName();
    14. System.out.println("线程[" + name + "]生成的数是:" + i);
    15. threadLoad.set(i);
    16. try {
    17. Thread.sleep(3000);
    18. } catch (InterruptedException e) {
    19. throw new RuntimeException(e);
    20. }
    21. new Test2().test();
    22. // 在 Run 方法结束之前,以当前线程名获取出数据并打印。查看是否可以取出操作
    23. Object o = threadLoad.get();
    24. System.out.println("在线程["+name+"]快结束时取出关联的数据是:" + o);
    25. }
    26. }
    27. public static void main(String[] args) {
    28. // 创建线程
    29. for (int i = 0; i < 3; i++) {
    30. new Thread(new Task()).start();
    31. }
    32. }
    33. }
    34. public class Test2 {
    35. public void test() {
    36. String name = Thread.currentThread().getName();
    37. System.out.println("Test 当前线程[" + name + "]中保存的数据是:"
    38. + ThreadLocalTest2.threadLoad.get());
    39. }
    40. }
    41. 结果:

       

    42. 相关阅读:
      Django路由Path方法
      天图资本通过香港上市聆讯:上半年利润下滑24%,王永华为董事长
      论文精读——YOLOv3: An Incremental Improvement
      Task Computing【动态规划_牛客】
      移动云获取推拉流地址
      概论_第2章随机变量及其概率分布__离散型随机变量之二项分布
      原来还能这样看Java线程的状态及转换
      获得微店商品详情 API
      【python海洋专题十九】找范围的语句进阶版本
      linux开发工具的使用
    43. 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126107644
      • 最新文章
      • 沪漂五周年了:我越来越迷茫了
        Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
        MySQL-Seconds_behind_master的精度误差
        [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
        AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
        Agent OS :五种驯服不确定性的范式
        PortSwigger SQL注入LAB11
        数据库即时编译JIT
        [Begin]AI Learn Data Day 0
        深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号