带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(14)

简介: 带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(14)

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(13)https://developer.aliyun.com/article/1340056?groupCode=taobaotech

思考&小结

 

ThreadLocalMap中的Entry为什么要设计为弱引用类型?

若使用强引用类型,则threadlocal的引用链为:Thread -> ThreadLocal.ThreadLocalMap -> Entry[] -> Entry -> key(threadLocal对象)和value;在这种场景下,只要这个线程还在运行(如线程池场景),若不调用remove方法,则该对象及关联的所有强引用对象都不会被垃圾回收器回收。

 

使用static和不使用static修饰threadlocal变量有和区别?

若使用static关键字进行修饰,则一个线程仅对应一个线程变量;否则,threadlocal语义变为perThread-per- Instance,容易引发内存泄漏,如下述示例:

public class ThreadLocalTest {
public static class ThreadLocalDemo {
private ThreadLocal<String> threadLocalHolder = new ThreadLocal();
public void setValue(String value) {
threadLocalHolder.set(value);


 

7

 

}

8

 

 

9

 

public String getValue() {

10

 

return threadLocalHolder.get();

11

 

}

12

 

}

13

 

 

14

 

public static void main(String[] args) {

15

 

int count = 3;

16

 

List<ThreadLocalDemo> list = new LinkedList<>();

17

 

for (int i = 0; i < count; i++) {

18

 

ThreadLocalDemo demo = new ThreadLocalDemo();

19

 

demo.setValue("demo-" + i);

20

 

list.add(demo);

21

 

}

22

 

System.out.println();

23

 

}

24

}

 

 

 

 

在上述main方法第22行debug,可见线程的threadLocals变量中有3个threadlocal实例。在工程实践中,使用 threadlocal时通常期望一个线程只有一个threadlocal实例,因此,若不使用static修饰,期望的语义发生了变化,  同时易引起内存泄漏。

image.png

 

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(15)https://developer.aliyun.com/article/1340054?groupCode=taobaotech

相关文章
|
15天前
|
安全 Java 调度
Java语言多线程编程技术深度解析
Java语言多线程编程技术深度解析
288 1
|
16天前
|
缓存 监控 安全
Java的线程池和线程安全
Java的线程池和线程安全
|
10天前
|
缓存 Java 测试技术
Java性能优化(八)-多线程调优-线程池大小设置
Java性能优化(八)-多线程调优-线程池大小设置
11 0
|
12天前
|
开发框架 监控 Java
【.NET Core】多线程之线程池(ThreadPool)详解(二)
【.NET Core】多线程之线程池(ThreadPool)详解(二)
30 3
|
12天前
|
SQL 开发框架 Java
【.NET Core】多线程之线程池(ThreadPool)详解(一)
【.NET Core】多线程之线程池(ThreadPool)详解(一)
22 2
|
15天前
|
安全 算法 Java
Java中的并发编程技术:解锁高效多线程应用的秘密
Java作为一种广泛应用的编程语言,其并发编程技术一直备受关注。本文将深入探讨Java中的并发编程,从基本概念到高级技巧,帮助读者更好地理解并发编程的本质,并学会如何在多线程环境中构建高效可靠的应用程序。
|
15天前
|
存储 安全 Java
Java语言中的多线程编程技术深入解析
Java语言中的多线程编程技术深入解析
220 1
|
15天前
|
安全 Java
JAVA语言中的多线程编程技术
JAVA语言中的多线程编程技术
|
15天前
|
Java 调度
Java的线程创建与生命周期技术性详解
Java的线程创建与生命周期技术性详解
27 0
|
15天前
|
缓存 安全 Java
Java的线程池与并发工具类技术性文章
Java的线程池与并发工具类技术性文章
12 0