ThreadLocal(下)继承性问题解决及实现原理

ThreadLocal不支持继承性

首先看一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestThreadLocal {

// (1) 创建线程变量
public static ThreadLocal<String> threadLocal = new ThreadLocal<String>();

public static void main(String[] args) {
// (2) 设置线程变量
threadLocal.set("hello world");
// (3) 启动子线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// (4) 子线程输出线程变量的值
System.out.println("thread: " + threadLocal.get());
}
});

thread.start();

// (5) 主线程获取并输出threadLocal的值
System.out.println("main: " + threadLocal.get());
}
}
阅读更多

ThreadLocal(中)实现原理如何做到本地化

ThreadLocal实现原理

下面是ThreadLocal相关类的类结构图,如图:

image-20200407164556036.png

由该图可知,Thread类中有一个threadLocals和一个inheritableThreadLocals,它们都是ThreadLocalMap类型的变量,而ThreadLocalMap是一个定制化的HashMap。在默认情况下,每个线程中的这两个变量都为null,

阅读更多

ThreadLocal(上)介绍及使用篇

出现背景:

多线程访问同一个共享变量特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时,为了保证线程安全,一般使用者在访问共享变量时进行适当的同步。如图所示

image-20200323150913

同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这就显然加重了使用者的负担,那么有没有一种方式可以做到,当创建一个变量后,每个线程对其进行访问的时候访问的是自己线程的变量呢?ThreadLocal他可以,虽然他不是为了解决这个问题出现的。

阅读更多