• 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技术文章。请多关注收藏!

  • 相关阅读:
    odoo lable oe_edit_only
    odoo many2one,在视图继续索引?related
    odoo menuitem
    odoo 另一种二级联动Reference
    odoo tree 多行同时编辑
    odoo根据条件,使字段只读,隐藏
    Oracle:dba_hist_seg_stat_obj 字典表 初步研究
    Centos6:linux上的 spicevdagent:spice 客户端辅助代理:自动调整linux客户端的分辨率
    Centos6:linux:图形界面:无法正常登陆,输入用户及密码 又返回到登陆界面:无限重复登陆问题
    Centos:linux:bridge vs bond 虚拟软设备
  • 原文地址:https://www.cnblogs.com/shsxt/p/8391897.html
Copyright © 2020-2023  润新知