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

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

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

image.pngthreadLocal.set()方法

 

/**
*Sets the current thread's copy of this thread-local variable
*to the specified value. Most subclasses will have no need to
*override this method, relying solely on the {@link #initialValue}
*method to set the values of thread-locals.
*
*@param value the value to be stored in the current thread's copy of
* this thread-local.
*/
public void set(T value) {
// 1. 获取当前线程
Thread t = Thread.currentThread();
// 2. 获取当前线程内部的ThreadLocalMap变量ThreadLocalMap map = getMap(t);
if (map != null)
// 3. 设 置 value map.set(this, value);
else
// 4. 若map为null则创建ThreadLocalMap createMap(t, value);
}

 

 

image.pngThreadLocalMap

从JDK源码可见,ThreadLocalMap中的Entry是弱引用类型的,这就意味着如果这个ThreadLocal只被这个 Entry引用,而没有被其他对象强引用时,就会在下一次GC的时候回收掉。

 

static class ThreadLocalMap {
/**
*The entries in this hash map extend WeakReference, using
*its main ref field as the key (which is always a
*ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
*entry can be expunged from table. Such entries are referred to
*as "stale entries" in the code that follows.

 

 


image.pngthreadLocal.set()方法

 

 

 

10

 

*/

11

 

static class Entry extends WeakReference<ThreadLocal<?>> {

12

 

/** The value associated with this ThreadLocal. */

13

 

Object value;

14

 

 

15

 

Entry(ThreadLocal<?> k, Object v) {

16

 

super(k);

17

 

value = v;

18

 

}

19

 

}

20

 

 

21

 

// ...

22

}

 

 

 

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

 

相关文章
|
2月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
194 64
|
2月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
120 38
|
10天前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
2月前
|
Java
.如何根据 CPU 核心数设计线程池线程数量
IO 密集型:核心数*2 计算密集型: 核心数+1 为什么加 1?即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保 CPU 的时钟周期不会被浪费。
65 4
|
2月前
|
Java
线程池内部机制:线程的保活与回收策略
【10月更文挑战第24天】 线程池是现代并发编程中管理线程资源的一种高效机制。它不仅能够复用线程,减少创建和销毁线程的开销,还能有效控制并发线程的数量,提高系统资源的利用率。本文将深入探讨线程池中线程的保活和回收机制,帮助你更好地理解和使用线程池。
101 2
|
2月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
353 2
|
3月前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
167 0
剖析Tomcat线程池与JDK线程池的区别和联系!
|
3月前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
101 0
|
13天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
38 1
|
3月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
63 1