ThreadLocal 通过get和set方法,为每个使用该变量的线程提供一个独立的副本,使得线程安全的共享某个变量;使用 set 方法设置变量后,一定要记得及时使用 remove 方法清理,否则多线程调用时会产生脏数据。

举个栗子,清晰的说明 ThreadLocal 的使用:

public class ThreadLocalTest {public static void main(String[] args) {final A a = new A();final B b = new B();for(int i = 0 ; i < 15 ; i ++) {final String resouce1 = "线程-" + i;final String resouce2 = " value = (" + i + ")";final ThreadLocal<String> threadLocal = new ThreadLocal<String>();final String value = "thread-"+i;new Thread(()->{try {a.setOne(resouce1);a.setTwo(resouce2);b.display();threadLocal.set(value);System.out.println(resouce1+" " +threadLocal.get());} finally {ResourceClass.RESOURCE_1.remove();ResourceClass.RESOURCE_2.remove();threadLocal.remove();}}).start();}}static class ResourceClass {public final static ThreadLocal<String> RESOURCE_1 = new ThreadLocal<String>();public final static ThreadLocal<String> RESOURCE_2 = new ThreadLocal<String>();}static class A {public void setOne(String value) {ResourceClass.RESOURCE_1.set(value);}public void setTwo(String value) {ResourceClass.RESOURCE_2.set(value);}}static class B {public void display() {System.out.println(ResourceClass.RESOURCE_1.get()+ ":"+ ResourceClass.RESOURCE_2.get());}}}

Java 并发编程之 ThreadLocal 线程局部变量相关推荐

  1. Java并发编程之ThreadLocal源码分析

    1 一句话概括ThreadLocal   什么是ThreadLocal?顾名思义:线程本地变量,它为每个使用该对象的线程创建了一个独立的变量副本. 2 ThreadLocal使用场景   用一句话总结 ...

  2. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  3. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  4. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  5. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  6. 并发编程之 Executor 线程池原理与源码解读

    并发编程之 Executor 线程池原理与源码解读 线程是调度 CPU 资源的最小单位,线程模型分为 KLT 模型与 ULT 模型,JVM使用的是 KLT 模型.java线程与 OS 线程保持 1:1 ...

  7. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  8. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  9. Java并发编程之Lock

    Java并发编程:Lock Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.uti ...

最新文章

  1. python 点的投影变换
  2. redux-thunk的简单使用
  3. 2020对于音视频行业意味着什么?
  4. 【Mood 16 】史上最全github使用方法:github入门到精通
  5. 三星电子预计第四季度营业利润为9万亿韩元 低于分析师预期
  6. 微软发布ASP.NET MVC 1.0正式版
  7. 修改配置文件后不重启程序即时生效
  8. pycharm Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon run
  9. c语言串逐位和 思路,蓝桥杯c语言练习题答案.doc
  10. 《ABAQUS 6.14超级学习手册》——2.2 特性模块(Property)
  11. win10专业版开机画面模糊_为什么win10有些软件显示模糊_win10软件界面模糊的解决办法...
  12. c语言题 设圆的半径,C语言初学者:编程序:设圆半径r圆柱高h,求圆周长面积圆柱体积圆球表面积...
  13. Invalid regular expression flags 错误
  14. 微信PC版Hook发送群艾特消息研究
  15. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服:4处无限刷新的打怪点!升级比血色站桩还快!...
  16. Unity3D制作3维立体小游戏
  17. 02 Uber Go 语言编码规范 - 指导原则 - interface 合理性验证
  18. 关于oracle的递归查询
  19. 解决word目录右侧页码大小不一致和不对齐的问题
  20. VUE(现代库) VS jquery(传统库)

热门文章

  1. 广和通再推5G利器,发布高性价比5G模组FM650
  2. 判定两个点是否在一条直线的同一侧_计算几何01-判定两条线段是否相交
  3. 递归函数合式分解python_零基础学python-18.2 递归函数与分解递归函数的执行步骤
  4. PVS-Studio C/C++/C++11 静态代码分析工具
  5. python全栈开发笔记---------数据类型-----集合set
  6. nginx关闭websocket
  7. WinForm DataGridView新增加行
  8. 实战详解WSUS2.0+SP1部署:WSUS2.0系列之一
  9. C算法编程题(七)购物
  10. 异常:Exception