zoukankan      html  css  js  c++  java
  • 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技术文章。请多关注收藏!

  • 相关阅读:
    Windows性能计数器应用
    Azure Oracle Linux VNC 配置
    Azure 配置管理系列 Oracle Linux (PART6)
    Azure 配置管理系列 Oracle Linux (PART5)
    Azure 配置管理系列 Oracle Linux (PART4)
    Azure 配置管理系列 Oracle Linux (PART3)
    Azure 配置管理系列 Oracle Linux (PART2)
    vagrant多节点配置
    docker基本操作
    LINUX开启允许对外访问的网络端口命令
  • 原文地址:https://www.cnblogs.com/shsxt/p/8391897.html
Copyright © 2011-2022 走看看