【面试题集】什么是ThreadLocal?底层如何实现的?结合我的开源项目说明

ThreadLocal概念及原理

品茗IT-面试题集-首发

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

ThreadLocal是一个解决线程并发问题的一个类,用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。

每个线程都会拥有他们自己的Thread变量,他们可以使用get/set方法去获取他们的默认值或者在线程内部改变他们的值。ThreadLocal实例通常是希望他们同线程状态关联起来是private static属性。

底层实现主要是存有一个map,以线程作为key,泛型作为value,可以理解为线程级别的缓存。每一个线程都会获得一个单独的map。

在Spring中,ThreadLocal是特别常见的,如:

  • RequestContextHolder中的
private static final ThreadLocal<RequestAttributes> requestAttributesHolder =
			new NamedThreadLocal<>("Request attributes");

用来保存Request对象。

  • TransactionSynchronizationManager中的
private static final ThreadLocal<Map<Object, Object>> resources =
			new NamedThreadLocal<>("Transactional resources");

用来保存当前事务。

示例说明

这里是简单的示例:

在我的开源工具mybatis-proxy中,使用了一个类似Spring事务管理的类,使用的就是ThreadLocal,代码如下:

import java.util.HashMap;
import java.util.Map;

public class TransactionManager {

	private static final ThreadLocal<Map<Object, Object>> resources = new ThreadLocal<>();

	public static Object getResource(Object actualKey) {
		Map<Object, Object> map = resources.get();
		if (map == null) {
			return null;
		}
		Object value = map.get(actualKey);
		return value;
	}

	public static void bindResource(Object actualKey, Object value) throws IllegalStateException {
		Map<Object, Object> map = resources.get();
		// set ThreadLocal Map if none found
		if (map == null) {
			map = new HashMap<>();
			resources.set(map);
		}
		map.put(actualKey, value);
	}

	public static Object unbindResource(Object actualKey) {
		Map<Object, Object> map = resources.get();
		if (map == null) {
			return null;
		}
		Object value = map.remove(actualKey);
		// Remove entire ThreadLocal if empty...
		if (map.isEmpty()) {
			resources.remove();
		}
		return value;
	}

}

这里,每个线程保存了一个map对象,map中根据key来存储当前线程的独有对像,切记一定要有remove。

品茗IT-博客专题:https://www.pomit.cn/lecture.html汇总了Spring专题、Springboot专题、SpringCloud专题、web基础配置专题。

快速构建项目

Spring项目快速开发工具:

一键快速构建Spring项目工具

一键快速构建SpringBoot项目工具

一键快速构建SpringCloud项目工具

一站式Springboot项目生成

Mysql一键生成Mybatis注解Mapper

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot使用吧!
品茗IT交流群

你可能感兴趣的:(面试题集)