ThreadLocal不好用?那是你没用对!(6)

简介: ThreadLocal不好用?那是你没用对!(6)

c) 解决线程安全问题:ThreadLocal


1.ThreadLocal 介绍


ThreadLocal 从字面的意思来理解是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能使用自己的变量。


以上面线程池格式化时间为例,当线程池中有 10 个线程时,SimpleDateFormat 会存入 ThreadLocal 中,它也只会创建 10 个对象,即使要执行 1000 次时间格式化任务,依然只会新建 10 个 SimpleDateFormat 对象,每个线程调用自己的 ThreadLocal 变量。


2.ThreadLocal 基础使用


ThreadLocal 常用的核心方法有三个:


  1. set 方法:用于设置线程独立变量副本。没有 set 操作的 ThreadLocal 容易引起脏数据。


  1. get 方法:用于获取线程独立变量副本。没有 get 操作的 ThreadLocal 对象没有意义。


  1. remove 方法:用于移除线程独立变量副本。没有 remove 操作容易引起内存泄漏。


ThreadLocal 所有方法如下图所示:


微信图片_20220120184747.jpg


官方说明文档:https://docs.oracle.com/javase/8/docs/api/


ThreadLocal 基础用法如下:


/**
 * @公众号:Java中文社群
 */
publicclass ThreadLocalExample {
    // 创建一个 ThreadLocal 对象
    privatestatic ThreadLocal<String> threadLocal = new ThreadLocal<>();
    public static void main(String[] args) {
        // 线程执行任务
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName();
                System.out.println(threadName + " 存入值:" + threadName);
                // 在 ThreadLocal 中设置值
                threadLocal.set(threadName);
                // 执行方法,打印线程中设置的值
                print(threadName);
            }
        };
        // 创建并启动线程 1
        new Thread(runnable, "MyThread-1").start();
        // 创建并启动线程 2
        new Thread(runnable, "MyThread-2").start();
    }
    /**
     * 打印线程中的 ThreadLocal 值
     * @param threadName 线程名称
     */
    private static void print(String threadName) {
        try {
            // 得到 ThreadLocal 中的值
            String result = threadLocal.get();
            // 打印结果
            System.out.println(threadName + " 取出值:" + result);
        } finally {
            // 移除 ThreadLocal 中的值(防止内存溢出)
            threadLocal.remove();
        }
    }
}


以上程序的执行结果为:


微信图片_20220120184902.jpg


从上述结果可以看出,每个线程只会读取到属于自己的 ThreadLocal 值。

相关文章
|
7月前
|
存储 机器学习/深度学习 缓存
我惊了!!!ThreadLocal 源码存在内存泄露的 Bug!!!
我惊了!!!ThreadLocal 源码存在内存泄露的 Bug!!!
|
12月前
|
存储 消息中间件 JavaScript
ThreadLocal 你真的用不上吗?
ThreadLocal 你真的用不上吗?
|
存储 缓存 Java
终于弄明白了ThreadLocal
ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。
112 0
终于弄明白了ThreadLocal
J3
|
存储 安全 Java
synchronized解析及锁膨胀过程,面试再也不怕了
synchronized解析及锁膨胀过程,面试再也不怕了
J3
484 0
synchronized解析及锁膨胀过程,面试再也不怕了
|
Java
如何避免忘记清理 ThreadLocal ?
hreadLocal 可以解决“线程安全问题”。 也可以作为上下文暂存数据以备后续步骤获取。 但是 ThreadLocal 用不好的确容易产生故障,因而有些团队不允许使用 ThreadLocal。 最核心的一个原因是很容易忘记清理,在线程池环境下复用导致串环境。 那么,有什么优雅的解法没?本文给出自己的一个解法。
639 0
如何避免忘记清理 ThreadLocal ?
ThreadLocal不好用?那是你没用对!(2)
ThreadLocal不好用?那是你没用对!(2)
77 0
ThreadLocal不好用?那是你没用对!(2)
ThreadLocal不好用?那是你没用对!(12)
ThreadLocal不好用?那是你没用对!(12)
117 0
ThreadLocal不好用?那是你没用对!(12)
|
Java
ThreadLocal不好用?那是你没用对!(1)
ThreadLocal不好用?那是你没用对!(1)
105 0
ThreadLocal不好用?那是你没用对!(1)
|
Java
ThreadLocal不好用?那是你没用对!(15)
ThreadLocal不好用?那是你没用对!(15)
95 0
ThreadLocal不好用?那是你没用对!(11)
ThreadLocal不好用?那是你没用对!(11)
90 0
ThreadLocal不好用?那是你没用对!(11)