「Java 路线」| ThreadLocal

2021-01-02  本文已影响0人  彭旭锐

点赞关注,不再迷路,你的支持对我意义重大!

🔥 Hi,我是丑丑。本文 「Java 路线」| 导读 —— 他山之石,可以攻玉 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)


前言


目录


1. 前置知识

这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~


2. 简介

2.1 定义

ThreadLocal 是一种 Thread-Specific Storage 的多线程编程模式,即:一个入口为多个线程分配不同的副本。由于线程间在某一时刻访问的并非同一个对象,这样就避免了多线程的数据共享,也就避免了并发安全问题。

2.2 使用场景

2.3 编程规约

记得吗?《阿里巴巴Java开发手册》中提到过关于 ThreadLocal 的编程规约,如下所示:

private static final ThreadLocal<DataFormat> df = new ThreadLocal<DateFormat>(){
    @Override
    protected DateFormat initialValue(){
        return new SimpleDateFormat("yyyy-MM-dd");
    }
};

说明: 如果是JDK8的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe.

提示:第 4 节 使用示例 中,ThreadLocal 变量就是使用 static 修饰的。


3. 使用介绍


4. 使用示例

作为一枚 Android 党,我就以熟悉的 Handler 机制中对 ThreadLocal 的应用作为例子:

android.os.Looper.java

public class Looper {

    1、静态 ThreadLocal 变量,所有类实例共享同一个 ThreadLocal 变量
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        
        2、设置 ThreadLocal 变量的值
        sThreadLocal.set(new Looper(quitAllowed));
    }

    public static Looper myLooper() {
        3、获取 ThreadLocal 变量的值
        return sThreadLocal.get();
    }

    public static void prepare() {
        prepare(true);
    }
    ...
}

要点如下:

我们可以画出 Looper 中访问 ThreadLocal 的 Timethreads 图,不同线程访问的是不同的 Looper 对象,线程间不存在共享资源


5. 源码分析


6. 总结


参考资料


创作不易,你的「三连」是丑丑最大的动力,我们下次见!

上一篇下一篇

猜你喜欢

热点阅读