ThreadLocal类的简单使用

JAVA学习网 2018-02-01 00:58:02

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

阅读(717) 评论(0)