ThreadLocal简介

我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。

那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK提供的ThreadLocal正是为了解决这样的问题的。

类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有变量。

先举个栗子

示例代码如下:

运行结果:

可以看出虽然多个线程对同一个变量进行访问,但是由于threadLocal变量由ThreadLocal 修饰,则不同的线程访问的就是该线程设置的值,这里也就体现出来ThreadLocal的作用。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

ThreadLocal与synchronized同步机制的比较

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。

ThreadLocal是线程局部变量,是一种多线程间并发访问变量的解决方案。和synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的方式,为每个线程提供变量的独立副本,以保证线程的安全。

本文来自千锋教育,转载请注明出处。

线程本地ThreadLocal的介绍与使用!相关推荐

  1. 线程本地数据ThreadLocal

    layout: post title: "线程本地数据ThreadLocal" subtitle: " "每个线程都有自己的数据,互不干扰."&quo ...

  2. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  3. 详解线程本地变量ThreadLocal

    并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味着,如果你在一个线程里改变 ...

  4. java 线程变量put_Java线程(篇外篇):线程本地变量ThreadLocal

    首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如hibernate中的OpenSessi ...

  5. ThreadLocal线程本地存储

    2019独角兽企业重金招聘Python工程师标准>>> 什么是ThreadLocal?首先要说明的一点是ThreadLocal并不是一个Thread,而是Thread的局部变量.在J ...

  6. java多线程之线程本地数据ThreadLocal

    layout: post title: "java多线程之线程本地数据ThreadLocal" subtitle: " "每个线程都有自己的数据,互不干扰.&q ...

  7. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  8. c语言 多个线程对同一变量执行memcpy_你可曾听过网络编程中应用线程本地存储?...

    壹:你可曾听过线程本地存储? 1. 什么是线程本地存储? 线程本地存储:thread local storage(简称TLS).也叫线程特有存储:thread specific storage(简称T ...

  9. 线程安全的map_ThreadLocal | 线程本地存储

    并发场景下,多个线程同时读写共享变量就有可能产生并发安全问题.反过来也可以说,不存在共享变量,就不会出现线程安全问题.Java中有两种常用的避免共享变量的方法,使用局部变量,以及使用 ThreadLo ...

最新文章

  1. SpringMVC集成Tiles布局引擎框架
  2. 返回浏览器或div 顶部
  3. C#从剪贴板中获取数据
  4. 树莓派3B 安装中文输入法谷歌输入法途中碰到的各种问题
  5. LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words
  6. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)
  7. 彻夜怒肝!SpringBoot+Sentinel+Nacos高并发已撸完
  8. 原价19万的美系插混,2年后落地只要11万~15万,微蓝6 PHEV为啥这么惨
  9. 网上找的,C# 小票打印机 直接打印,备用
  10. javascript二维数组
  11. 自媒体如何一步步变成臭要饭的(其二)
  12. PHP开发环境准备,PHPWAMP使用,图文教程
  13. 手机里多个PDF合并成一个PDF的免费方法
  14. 131多机型解码擦除工具
  15. 研发面试问题回答技巧
  16. IP范围表示法(网络子网划分)
  17. 论文中的定理(Theorem)、引理(Lemma)、推论(Corollary)
  18. 申报绿色工厂的条件和标准是什么?
  19. 【转载】Cmd Markdown 数学公式指导手册
  20. npm ERR! code EINTEGRITY 错误原因记录

热门文章

  1. 线下活动 × 深圳 | 大咖云集!第11届国际博士生论坛报名开启
  2. 本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力
  3. web 小程序 ch2 第一个小程序
  4. 【神经网络架构】Pyramidal Convlution(PyConv):金字塔卷积,“即插即用“,提升你的网络性能
  5. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...
  6. ffmpeg 声音参数_ffmpeg转换参数和压缩输出大小的比率
  7. hutool中的threadutil_Hutool - 好用的Java工具类库
  8. 【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
  9. Struts2-获取值栈对象与结构
  10. Spring Security——根据请求Header[Accept]不同返回不同类型资源解决方案