1、什么是线程栈封闭?
1.1 线程栈是什么?
- 线程栈 是某个线程的一块专属内存空间。线程独享,其他线程无法访问。也就意味着不存在线程安全问题。
- 线程栈由多个 栈帧 组成。一个线程会执行一个或多个方法,一个 方法 就对应着一个栈帧。
1.2 什么叫线程栈封闭?
- 多线程访问共享可变数据时,涉及到线程间的数据同步问题。但并非所有时候,都需要用到共享数据,故而提出了线程封闭的概念。
- 数据被封闭在线程各自的栈空间中,不需要进行数据同步 。这种通过将数据封闭在线程中而避免使用线程间数据同步的策略称之为线程封闭。也可以称为 线程栈封闭。
- 线程封闭的其中一种体现:ThreadLocal.
2、ThreadLocal 如何使用?
ThreadLocal介绍
- ThreadLocal是Java中的一种特殊变量,是线程级别的变量。
- 每一个线程都有一个ThreadLocal,即每一个线程都拥有一个专属的独立变量,不存在线程安全问题,在并发模式下是绝对安全的。
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class ThreadLocalTests {
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
@Test
public void threadLocalTypeString() throws InterruptedException {
Thread.currentThread().setName("mainThread");
threadLocal.set("value of mainThread's threadLocal");
log.info(" ======== 主线程 " + Thread.currentThread().getName() + " 首次获取threadLocal的value值:{}",
threadLocal.get());
new Thread(() -> {
threadLocal.set("value of subThreadNO1's threadLocal");
log.info(" ======== 子线程 " + Thread.currentThread().getName() + " 获取threadLocal的value值:{}",
threadLocal.get());
}, "subThreadNO1").start();
Thread.sleep(5000L);
log.info(" ======== 主线程 " + Thread.currentThread().getName() + " 再次获取threadLocal的value值:{}",
threadLocal.get());
}
}
- 程序运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190929180812271.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1YjExNg==,size_16,color_FFFFFF,t_70)
3、Github链接
Github链接