本文将详细介绍Java并发编程(多线程)中常见的 ThreadLocal 类以及如何去使用它。
ThreadLocal类
1、ThreadLocal 是 Java 中提供的一种机制,用于为每个线程提供独立的变量副本,确保每个线程都有自己的变量,而不会和其他线程共享这些变量(即每个线程都有独立的存储空间,线程之间互不干扰。)
用途:主要用于解决多线程并发访问时的线程安全问题,尤其是在不想使用复杂的锁机制时,它是非常有效的工具。
2、创建方式:
2.1 最基础的:
ThreadLocal tl = new ThreadLocal();
这时:
-
没有初始值;
-
第一次调用 get() 会返回 null(除非重写
initialValue())ThreadLocal<String> local = new ThreadLocal<String>() { @Override protected String initialValue() { return "默认值"; } };
2.2 推荐方式:这个本质上也是创建一个 ThreadLocal 实例。
ThreadLocal<String> local = ThreadLocal.withInitial(() -> "默认值");
3、常用方法:
get():
- 获取当前线程的
ThreadLocal变量值。 - 如果该线程是第一次调用
get(),则会返回通过initialValue()或withInitial()方法指定的初始值。
set(T value):
- 设置当前线程的
ThreadLocal变量值。
remove():
- 移除当前线程的
ThreadLocal变量,清除与线程绑定的值,释放内存。
initialValue():
- 为当前线程提供初始值,当线程第一次调用
get()时,如果没有通过set()设置值,就会调用initialValue()。
withInitial(Supplier<? extends T>):
- Java 8 引入的工厂方法,用来简化
ThreadLocal的初始化过程。它接受一个Supplier接口,提供初始化值。
4、示例:
public class Test {
// 创建一个 ThreadLocal 用于存储每个线程的账户余额:初始余额 100
private static ThreadLocal<Integer> balance = ThreadLocal.withInitial(() -> 100);
public void withdraw(int amount) {
balance.set(balance.get() - amount); // 每个线程更新自己的余额
}
public int getBalance() {
return balance.get(); // 获取当前线程的余额
}
public static void main(String[] args)

最低0.47元/天 解锁文章
71万+

被折叠的 条评论
为什么被折叠?



