Java 多线程ThreadLocal使用

前面文章多线程间的同步控制和通信,是为了保证多个线程对共享数据争用时的正确性的。那如果一个操作本身不涉及对共享数据的使用,相反,只是希望变量只能由创建它的线程使用(即线程隔离)就需要到线程本地存储了。

Java 通过 ThreadLocal 提供了程序对线程本地存储的使用。

通过创建 ThreadLocal 类的实例,让我们能够创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码引用了相同名称的 ThreadLocal 变量,这两个线程也无法看到彼此的存储在 ThreadLocal 里的值。否则也就不能叫线程本地存储了。

本文大纲如下:

ThreadLocal

ThreadLocal 是 Java 内置的类,全称 java.lang.ThreadLoaljava.lang 包里定义的类和接口在程序里都是可以直接使用,不需要导入的。

ThreadLocal 的类定义如下:

public class ThreadLocal<T> {
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        //......
        return setInitialValue();
    }
    
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);
        }
    }
    
     public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null) {
             m.remove(this);
         }
     }

    protected T initialValue() {
        return null;
    }
    
    public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {
        return new SuppliedThreadLocal<>(supplier);
    }
    
    // ...
}

上面只是列出了 ThreadLocal类里我们经常会用到的方法,这几个方法他们的说明如下。

  • T get()- 用于获取 ThreadLocal 在当前线程中保存的变量副本。
  • void set(T value) - 用于向ThreadLocal中设置当前线程中变量的副本。
  • void remove() - 用于删除当前线程保存在ThreadLocal中的变量副本。
  • initialValue() - 为 ThreadLocal 设置默认的 get方法获取到的始值,默认是 null ,想修改的话需要用子类重写 initialValue 方法,或者是用TheadLocal提供的withInitial方法 。

下面我们详细看一下 ThreadLocal 的使用。

创建和读写 ThreadLocal

通过上面 ThreadLocal 类的定义我们能看出来, ThreadLocal 是支持泛型的,所以在创建 ThreadLocal 时没有什么特殊需求的情况下,我们都会为其提供类型参数,这样在读取使用 ThreadLocal 变量时就能免去类型转换的操作。

private ThreadLocal threadLocal = new ThreadLocal();
threadLocal.set("A thread local val
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值