ThreadLocal类的简单使用

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

ThreadLocal主要解决就是每一个线程绑定本身的值,能够将ThreadLocal类当作全局存放数据的盒子。bash


2.基本使用ide

基本demo演示(存取值)spa

/**
 * @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类中进行保存。code

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

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();
    }

}复制代码

执行结果
blog


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

相关文章
相关标签/搜索