ThreadLocal的使用场景
最近项目中遇到如下的场景:在执行数据迁移时,需要按照用户粒度加锁,因此考虑使用排他锁,迁移工具和业务服务属于两个服务,因此需要使用分布式锁。
我们使用缓存(Tair或者Redis)实现分布式锁,具体代码如下:
@Service
public class Locker {@Resource(name = "tairClientUtil")private TairClientUtil tairClientUtil;private ThreadLocal<Long> lockerBeanThreadLocal = new ThreadLocal<>();public void init(long userid) {lockerBeanThreadLocal.remove();lockerBeanThreadLocal.set(userid);}public void updateLock() {String lockKey = Constants.MIGRATION_PREFIX + lockerBeanThreadLocal.get();tairClientUtil.incr(lockKey, Constants.COUNT_EXPIRE);}public void invalidLock() {String lockKey = Constants.MIGRATION_PREFIX + lockerBeanThreadLocal.get();tairClientUtil.invalid(lockKey);}
}
因为每个线程可能携带不同的userid发起请求,因此在这里使用ThreadLocal变量存放userid,使得每个线程都有一份自己的副本。
参考官方文档:ThreadLocal的用法,这个类提供“thread-local”变量,这些变量与线程的局部变量不同,每个线程都保存一份改变量的副本,可以通过get或者set方法访问。如果开发者希望将类的某个静态变量(user ID或者transaction ID)与线程状态关联,则可以考虑使用ThreadLocal。
举个例子,下面的类为每个线程生成不同的ID,当某个线程第一次调用Thread.get()时,会为该线程赋予一个ID,并且在后续的调用中不再改变。
import java.util.concurrent.atomic.AtomicInteger;public class ThreadId {// Atomic integer containing the next thread ID to be assignedprivate static final AtomicInteger nextId = new AtomicInteger(0);// Thread local variable containing each thread's IDprivate static final ThreadLocal<Integer> threadId =new ThreadLocal<Integer>() {@Override protected Integer initialValue() {return nextId.getAndIncrement();}};// Returns the current thread's unique ID, assigning it if necessarypublic static int get() {return threadId.get();}}
每个线程会“隐式”包含一份thread-local变量的副本,只要线程还处于活跃状态,就可以访问该变量;当线程停止后,如果没有其他线程持有该thread-local变量,则该变量的副本会提交给垃圾回收器。
java - When and how should I use a ThreadLocal variable? - Stack Overflow
— One possible (and common) use is when you have some object that is not thread-safe, but you want to avoid synchronizing access to that object (I'm looking at you, SimpleDateFormat). Instead, give each thread its own instance of the object.
ThreadLocal的使用场景相关推荐
- 多线程:什么是ThreadLocal?应用场景?
ThreadLocal(避免线程不安全问题) 什么是ThreadLocal? 线程本地变量,也有些地方叫做线程本地存储,他代表一个线程局部变量. 为什么要ThreadLocal? 如果一段代码中所需 ...
- 京东一面:说说ThreadLocal的使用场景及使用方式
来源 | 网络 正文 两大使用场景-ThreadLocal的用途 典型场景1: 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random) 典型场景2 ...
- 京东一面:说出ThreadLocal的使用场景及使用方式
点击关注公众号,实用技术文章及时了解 两大使用场景-ThreadLocal的用途 典型场景1: 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Rando ...
- 25. ThreadLocal的使用场景
ThreadLocal提供了get与set等访问接口或方法,这个方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值. ThreadLocal对象 ...
- 弱引用使用场景桌面_面试|再次讲解Threadlocal使用及其内存溢出
ThreadLocal彻底详解 整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题.希望读懂此文以后大家可以掌握: 简单介绍原理 ThreadLocal使用案例场景 Threadl ...
- threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白
1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring. 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal ...
- 使用 ThreadLocal 一次解决老大难问题!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:鲁毅 juejin.im/post/5e0d8765f265 ...
- 深入浅出ThreadLocal,你会吗?
ThreadLocal全面解析 学习目标 了解ThreadLocal的介绍 掌握ThreadLocal的运用场景 了解ThreadLocal的内部结构 了解ThreadLocal的核心方法源码 了解T ...
- 深入剖析ThreadLocal
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...
最新文章
- GPUImage滤镜之锐化
- 三维数据平滑处理_神木市抄数服务多少钱【博通三维】3D打印服务
- SDNU 1072.我们爱递归(水题)
- iOS开发GCD(3)-数据安全
- SQL:Mongoose在node中的应用
- Wireshark-Mac下找不到本地网卡
- C++ std::set insert 失败 原因和解决方案 operator
- 如何在Cadence Virtuoso中自定义快捷键?
- 让 CAS 5.1.8 支持http,解决未认证授权服务错误提示问题
- 物联网卡要求实名认证的真正原因你知道吗?
- 要怎么通过PHP发布微博动态:附代码详解
- 【错误记录】Ubuntu 下 VSCode 编译报错 ( 无法生成和调试,因为活动文件不是 C 或 C++ 源文件。终端进程启动失败(退出代码: -1)。终端将被任务重用,按任意键关闭。 )
- 决策理论与方法——效用函数
- webrtc】windows 构建 :depot_tools 采坑
- 海信计算机辅助统,海信计算机辅助手术系统(CAS)将覆盖山东三级医院
- php 仿面包网 源码 飞飞cms_飞飞cms5.0二开商业最新仿面包网PC+手机精品影视系统含会员,迅雷下载功能强大N188...
- 新财报背后,腾讯音乐高筑墙、广积粮
- EMMC丢失文件系统数据分析
- 第四门课 卷积神经网络(Convolutional Neural Networks)
- Fedora14 root 登陆 (by lsyz0021)
热门文章
- php图片美颜,Mac_Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片, 我们经常会使用美颜相机 - phpStudy...
- 非此即彼的逻辑错误_超全MBA逻辑答题口诀,快收藏!
- 厦门大学计算机科学每年的保研率是多少,厦大保研率大曝光,高达30%!研厦党该何去何从?...
- show在php,show.php
- 测试打桩_DNF:CEO实测旭旭宝宝红眼,打桩高达2494E,伤害超越狂人剑魂
- tomcat苹果版安装步骤_Mac系统安装和配置tomcat步骤详解
- linux 故障注入_阿里巴巴开源故障注入工具_chaosblade
- swift中单例的创建及销毁
- JS数组去重,JS根据数组里面的对象属性值去重
- iOS开发系列--让你的应用“动”起来