开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
前言
在多线程的环境下访问共享变量的时候,往往需要采用一定的同步机制来防止出现线程安全问题。往往会采用 synchronized 锁、ReentrantLock 锁等方式对访问共享变量加锁,但是如果使用不恰当容易造成死锁;此外,加锁的方式会一定程度上影响程序的性能。不过,在 Java 中,有一个 ThreadLoacl 类能够实现在创建变量后,每个线程对变量访问时访问的是线程自己的本地变量。
ThreadLocal 是什么
ThreadLocal 是 Java 中一个重要的工具类,它允许开发人员存储线程特定的数据,在多线程环境下更方便维护状态。换句话说,ThreadLocal 可以在每一个线程中存储线程特定的值,并且每个线程只能访问自己的值。
ThreadLocal 有两个重要的方法:set 和 get 。 set 方法用于在当前线程中设置一个值, get 方法用于在当前线程中获取一个值。
ThreadLocal 的简单实例
我们使用 ThreadLocal 保存并打印相关的变量信息,代码如下所示:
package com.zhongger.threadLearn;
/**
* @author zhongmingyi
* @date 2023/2/12 10:15 下午
*/
public class ThreadLocalLearn {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("当前线程1:" + Thread.currentThread().getName());
System.out.println("线程名称:" + threadLocal.get());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("当前线程2:" + Thread.currentThread().getName());
System.out.println("线程名称:" + threadLocal.get());
}
}).start();
}
}
运行结果如图所示:
从运行结果中我们可以看出来,在多线程环境下,ThreadLocal 是非常有用的,它可以避免多线程环境下的共享数据问题。 ThreadLocal 确保每个线程只能访问自己的数据,而不会影响其他线程的数据。 那么它是怎么实现的呢?原理又是什么呢?我们且听下回分解!