最近项目中遇到如下的场景:在执行数据迁移时,需要按照用户粒度加锁,因此考虑使用排他锁,迁移工具和业务服务属于两个服务,因此需要使用分布式锁。

我们使用缓存(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的使用场景相关推荐

  1. 多线程:什么是ThreadLocal?应用场景?

    ThreadLocal(避免线程不安全问题) 什么是ThreadLocal?  线程本地变量,也有些地方叫做线程本地存储,他代表一个线程局部变量. 为什么要ThreadLocal? 如果一段代码中所需 ...

  2. 京东一面:说说ThreadLocal的使用场景及使用方式

    来源 | 网络 正文 两大使用场景-ThreadLocal的用途 典型场景1: 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random) 典型场景2 ...

  3. 京东一面:说出ThreadLocal的使用场景及使用方式

    点击关注公众号,实用技术文章及时了解 两大使用场景-ThreadLocal的用途 典型场景1: 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Rando ...

  4. 25. ThreadLocal的使用场景

    ThreadLocal提供了get与set等访问接口或方法,这个方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值. ThreadLocal对象 ...

  5. 弱引用使用场景桌面_面试|再次讲解Threadlocal使用及其内存溢出

    ThreadLocal彻底详解 整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题.希望读懂此文以后大家可以掌握: 简单介绍原理 ThreadLocal使用案例场景 Threadl ...

  6. threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白

    1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring. 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal ...

  7. 使用 ThreadLocal 一次解决老大难问题!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:鲁毅 juejin.im/post/5e0d8765f265 ...

  8. 深入浅出ThreadLocal,你会吗?

    ThreadLocal全面解析 学习目标 了解ThreadLocal的介绍 掌握ThreadLocal的运用场景 了解ThreadLocal的内部结构 了解ThreadLocal的核心方法源码 了解T ...

  9. 深入剖析ThreadLocal

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

最新文章

  1. GPUImage滤镜之锐化
  2. 三维数据平滑处理_神木市抄数服务多少钱【博通三维】3D打印服务
  3. SDNU 1072.我们爱递归(水题)
  4. iOS开发GCD(3)-数据安全
  5. SQL:Mongoose在node中的应用
  6. Wireshark-Mac下找不到本地网卡
  7. C++ std::set insert 失败 原因和解决方案 operator
  8. 如何在Cadence Virtuoso中自定义快捷键?
  9. 让 CAS 5.1.8 支持http,解决未认证授权服务错误提示问题
  10. 物联网卡要求实名认证的真正原因你知道吗?
  11. 要怎么通过PHP发布微博动态:附代码详解
  12. 【错误记录】Ubuntu 下 VSCode 编译报错 ( 无法生成和调试,因为活动文件不是 C 或 C++ 源文件。终端进程启动失败(退出代码: -1)。终端将被任务重用,按任意键关闭。 )
  13. 决策理论与方法——效用函数
  14. webrtc】windows 构建 :depot_tools 采坑
  15. 海信计算机辅助统,海信计算机辅助手术系统(CAS)将覆盖山东三级医院
  16. php 仿面包网 源码 飞飞cms_飞飞cms5.0二开商业最新仿面包网PC+手机精品影视系统含会员,迅雷下载功能强大N188...
  17. 新财报背后,腾讯音乐高筑墙、广积粮
  18. EMMC丢失文件系统数据分析
  19. 第四门课 卷积神经网络(Convolutional Neural Networks)
  20. Fedora14 root 登陆 (by lsyz0021)

热门文章

  1. php图片美颜,Mac_Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片,  我们经常会使用美颜相机 - phpStudy...
  2. 非此即彼的逻辑错误_超全MBA逻辑答题口诀,快收藏!
  3. 厦门大学计算机科学每年的保研率是多少,厦大保研率大曝光,高达30%!研厦党该何去何从?...
  4. show在php,show.php
  5. 测试打桩_DNF:CEO实测旭旭宝宝红眼,打桩高达2494E,伤害超越狂人剑魂
  6. tomcat苹果版安装步骤_Mac系统安装和配置tomcat步骤详解
  7. linux 故障注入_阿里巴巴开源故障注入工具_chaosblade
  8. swift中单例的创建及销毁
  9. JS数组去重,JS根据数组里面的对象属性值去重
  10. iOS开发系列--让你的应用“动”起来