• ThreadLocal类的简单使用


    1.概述
    变量值的共享可以使用public 是static 变量的形式,所有的线程都使用同一个public static 变量。 如实现线程内的共享变量,jdk提供了ThreadLocal来解决这个问题。

    ThreadLocal主要解决就是每个线程绑定自己的值,可以将ThreadLocal类看成全局存放数据的盒子。
    2.基本使用

    基本demo演示(存取值)

    /**
     * @author 上海尚学堂 shsxt.com
     * 了解更多 加V:java8733
     */
    public class ThreadLocalDemo01 {
        
        public static ThreadLocal t1 = new ThreadLocal();
        
        public static void main(String[] args) {
            
            if (t1.get() == null) {
                System.out.println("从未放过值");
                t1.set("存放的值");
            }
            
            System.out.println(t1.get());
            System.out.println(t1.get());
            
        }
    }
    

      

    结果示例:
    从未放过值
    存放的值
    存放的值

    结果分析:
    从第一次调用t1.get()方法时候,返会的null.然后通过set() 方法赋值后顺利取出值。
    类ThreadLocal解决的是变量在不同线程间的隔离性。也就是不同线程拥有自己的值。不同线程中的值是可以放入ThreadLocal类中进行保存。

    3.隔离性
    验证线程变量的隔离性:

    package com.threadlocal;
    /**
     * 验证隔离性
     * @author 上海尚学堂 shsxt.com
     *
     */
    public class ThreadLocalDemo02 {
    
        public static ThreadLocal demo = new ThreadLocal();
    
        public static void main(String[] args) {
    
            ThreadA a = new ThreadA();
            a.start();
    
            ThreadB b = new ThreadB();
            b.start();
            try {
                for (int i = 0; i < 100; i++) {
                    demo.set("Main .." + (i + 1));
                    System.out.println("Main  getValue ..." + demo.get());
    
                    Thread.sleep(200);
                }
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
    class ThreadA extends Thread {
    
        @Override
        public void run() {
            try {
                for (int i = 0; i < 100; i++) {
    
                    ThreadLocalDemo02.demo.set("ThreadA" + (i + 1));
                    System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get());
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            super.run();
        }
    
    }
    
    class ThreadB extends Thread {
    
        @Override
        public void run() {
            try {
                for (int i = 0; i < 100; i++) {
    
                    ThreadLocalDemo02.demo.set("ThreadA" + (i + 1));
                    System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get());
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            super.run();
        }
    
    }
    

      

    执行结果

    小结:
    从上面执行的结果可以看的出来,每一个线程向ThreadLocal 中存值时,但是每个线程取出的都是自己线程的值。这也就验证的线程变量的隔离性。
    上海尚学堂Java教研组原创,转载请注明出处!感谢阅读上海尚学堂Java技术文章。请多关注收藏!

  • 相关阅读:
    md5盐加密
    springcloud alibaba文档
    http header, url参数转json
    Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000018DC4F2C520>: Failed to establish a new connection:
    Nacos配置(配置中心)
    java.lang.NoSuchFieldError: VERSION_2_3_0 报错解决方案
    Cannot resolve freemarker:freemarker:2.3.23
    springcloud nacos config 配置application.yml
    可选链操作符(?.)
    浏览器network
  • 原文地址:https://www.cnblogs.com/shsxt/p/8391897.html
Copyright © 2020-2023  润新知