java 多线程Java 专栏

Java ThreadLocal使用

2017-08-30  本文已影响144人  _凌浩雨

Java ThreadLocal使用

ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。

1.如何创建ThreadLocal变量
以下代码展示了创建ThreadLocal变量的三种方式:
方式一:直接创建对象
private ThreadLocal myThreadLocal = new ThreadLocal();
方式二:创建泛型对象
private ThreadLocal myThreadLocal = new ThreadLocal<String>();
方式三:创建泛型对象及初始化值

private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
    @Override
    protected String initialValue() {
        return "This is the initial value";
    }
};

通过代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值。
创建ThreadLocal对象时,我们可以指定泛型,这样我们就不需要每次对使用get()方法返回的值作强制类型转换了;并且我们也可以设置初始值。

2.如何访问ThreadLocal变量
一旦创建了一个ThreadLocal变量,你可以通过如下代码设置某个需要保存的值:
myThreadLocal.set("初始值”);
可以通过下面方法读取保存在ThreadLocal变量中的值:
String threadLocalValue = (String) myThreadLocal.get();
get()方法返回一个Object对象,set()对象需要传入一个Object类型的参数。

  1. 测试代码
public class Test {

    private static ThreadLocal<String> threadLocal;

    public static void main(String[] args) {

        threadLocal = new ThreadLocal<String>() {

            @Override
            protected String initialValue() {
                return "初始化值";
            }

        };
        
        for (int i = 0; i < 10; i++){
            new Thread(new MyRunnable(), "线程"+i).start();
        }

    }

    public static class MyRunnable implements Runnable {

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println(name + "的threadLocal"+ ",设置为" + name);
            threadLocal.set(name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {}
            System.out.println(name + ":" + threadLocal.get());
        }

    }

}

打印结果:

线程1的threadLocal,设置为线程1
线程4的threadLocal,设置为线程4
线程3的threadLocal,设置为线程3
线程2的threadLocal,设置为线程2
线程0的threadLocal,设置为线程0
线程6的threadLocal,设置为线程6
线程5的threadLocal,设置为线程5
线程7的threadLocal,设置为线程7
线程8的threadLocal,设置为线程8
线程9的threadLocal,设置为线程9
线程3:线程3
线程4:线程4
线程8:线程8
线程6:线程6
线程2:线程2
线程5:线程5
线程9:线程9
线程1:线程1
线程7:线程7
线程0:线程0
上一篇下一篇

猜你喜欢

热点阅读