java多线程——ThreadLocal

来源:互联网 发布:淘宝金三塔官方旗舰店 编辑:程序博客网 时间:2024/05/17 04:28

ThreadLocal介绍

ThreadLocal可以创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码具有对 ThreadLocal变量的引用,那么这两个线程不能看到对方的ThreadLocal变量。实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。

可以创建一个指定泛型类型的ThreadLocal对象,这样我们就不需要每次使用get()方法返回的值做强制类型转换。

ThreadLocal优势

ThreadLocal并不是用来并发控制访问一个共同对象,而是为了给每个线程分配一个只属于该线程的对象,更准确的说是为了实现线程间的数据隔离。而ThreadLocal应用场景更多是想共享一个变量,但是该变量又不是线程安全的,那么可以用ThreadLocal维护一个线程一个实例。有时候ThreadLocal也可以用来避免一些参数传递,通过ThreadLocal来访问对象。

threadlocal 常用方法

1、public void set(T value):将值放入线程局部变量中
2、public T get():从线程局部变量中获取值
3、public void remove():从线程局部变量中移除值(有助于 JVM 垃圾回收)
4、protected T initialValue():返回线程局部变量中的初始值(默认为 null,可以在新建对象时重写initialValue方法)

应用场景

  1. 实现单个线程单例以及单个线程上下文信息存储

  2. 实现线程安全,非线程安全的对象使用ThreadLocal之后就会变得线程安全,因为每个线程都会有一个对应的实例(比如SimpleDateFormat不能直接用作静态变量,线程不安全,但可以使用threadlocal将其改为线程安全的来使用)

  3. 承载一些线程相关的数据,避免在方法中来回传递参数

示例代码

public class ThreadLocalPractice {    public static void main(String[] args){        new Thread(new MyThread()).start();        new Thread(new MyThread()).start();    }}class MyThread implements Runnable{    private ThreadLocal<Integer> threadLocal = new ThreadLocal<>();    public void run(){        threadLocal.set((int)(Math.random()*1000));        try {            Thread.sleep(500);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());    }}

参考资料

Java ThreadLocal
理解Java中的ThreadLocal

1 0