线程本地ThreadLocal的介绍与使用!
ThreadLocal简介
我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。
那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK提供的ThreadLocal正是为了解决这样的问题的。
类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有变量。
先举个栗子
示例代码如下:
运行结果:
可以看出虽然多个线程对同一个变量进行访问,但是由于threadLocal变量由ThreadLocal 修饰,则不同的线程访问的就是该线程设置的值,这里也就体现出来ThreadLocal的作用。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal与synchronized同步机制的比较
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。
ThreadLocal是线程局部变量,是一种多线程间并发访问变量的解决方案。和synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的方式,为每个线程提供变量的独立副本,以保证线程的安全。
本文来自千锋教育,转载请注明出处。
线程本地ThreadLocal的介绍与使用!相关推荐
- 线程本地数据ThreadLocal
layout: post title: "线程本地数据ThreadLocal" subtitle: " "每个线程都有自己的数据,互不干扰."&quo ...
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...
- 详解线程本地变量ThreadLocal
并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味着,如果你在一个线程里改变 ...
- java 线程变量put_Java线程(篇外篇):线程本地变量ThreadLocal
首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如hibernate中的OpenSessi ...
- ThreadLocal线程本地存储
2019独角兽企业重金招聘Python工程师标准>>> 什么是ThreadLocal?首先要说明的一点是ThreadLocal并不是一个Thread,而是Thread的局部变量.在J ...
- java多线程之线程本地数据ThreadLocal
layout: post title: "java多线程之线程本地数据ThreadLocal" subtitle: " "每个线程都有自己的数据,互不干扰.&q ...
- 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理
前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...
- c语言 多个线程对同一变量执行memcpy_你可曾听过网络编程中应用线程本地存储?...
壹:你可曾听过线程本地存储? 1. 什么是线程本地存储? 线程本地存储:thread local storage(简称TLS).也叫线程特有存储:thread specific storage(简称T ...
- 线程安全的map_ThreadLocal | 线程本地存储
并发场景下,多个线程同时读写共享变量就有可能产生并发安全问题.反过来也可以说,不存在共享变量,就不会出现线程安全问题.Java中有两种常用的避免共享变量的方法,使用局部变量,以及使用 ThreadLo ...
最新文章
- SpringMVC集成Tiles布局引擎框架
- 返回浏览器或div 顶部
- C#从剪贴板中获取数据
- 树莓派3B 安装中文输入法谷歌输入法途中碰到的各种问题
- LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words
- 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)
- 彻夜怒肝!SpringBoot+Sentinel+Nacos高并发已撸完
- 原价19万的美系插混,2年后落地只要11万~15万,微蓝6 PHEV为啥这么惨
- 网上找的,C# 小票打印机 直接打印,备用
- javascript二维数组
- 自媒体如何一步步变成臭要饭的(其二)
- PHP开发环境准备,PHPWAMP使用,图文教程
- 手机里多个PDF合并成一个PDF的免费方法
- 131多机型解码擦除工具
- 研发面试问题回答技巧
- IP范围表示法(网络子网划分)
- 论文中的定理(Theorem)、引理(Lemma)、推论(Corollary)
- 申报绿色工厂的条件和标准是什么?
- 【转载】Cmd Markdown 数学公式指导手册
- npm ERR! code EINTEGRITY 错误原因记录
热门文章
- 线下活动 × 深圳 | 大咖云集!第11届国际博士生论坛报名开启
- 本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力
- web 小程序 ch2 第一个小程序
- 【神经网络架构】Pyramidal Convlution(PyConv):金字塔卷积,“即插即用“,提升你的网络性能
- Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...
- ffmpeg 声音参数_ffmpeg转换参数和压缩输出大小的比率
- hutool中的threadutil_Hutool - 好用的Java工具类库
- 【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
- Struts2-获取值栈对象与结构
- Spring Security——根据请求Header[Accept]不同返回不同类型资源解决方案