码农知识堂 - 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. 相关阅读:
      Eigen库学习(2)--------------几何模块
      锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞复现(XVE-2024-2116)
      【配置环境】Windows下C/C++第三方库管理工具vcpkg安装和使用
      【考研】数据结构考点——直接插入排序
      1876. 长度为三且各字符不同的子字符串
      Chatbot(五)
      PDF文件格式(二):交叉引用类型“O“
      努力前行,平凡的我们也能画出一条星光闪耀的轨迹——人大女王金融硕士项目
      Java 异常处理、继承、重写/重载
      Altair:Python数据可视化库的魅力之旅
    43. 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126107644
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号