线程变量---ThreadLocal类
- 用处:保存线程的独立变量。对一个线程类(继承自Thread)
- 思想:如果一个资源会引起线程竞争,那就为每一个线程配置一个资源。相比于synchronized是一种空间换时间的策略
- 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。常用于用户登录控制,如记录session信息
- ThreadLocal其实就是一个特殊的容器,也有get、set方法
- 每一个ThreadLocal只能维护一个共享资源,一旦声明ThreadLocal实例,线程在调用get()方法获取资源副本的时候,就可以自动设置绑定到该线程本身
- ThreadLocal泛型指定持有的变量类型,创建的时候可以使用匿名对象new ThreadLocal(){ initialValue()}初始化值,或者做一些别的操作
- ThreadLocal类中可重载的方法
- set(value):设置值
- get():取值
- remove():移除值
- initialValue():如果get的时候还没有设置值,就使用这个方法进行初始化
- 一般会使用initialValue()方法提供一个初始值
- 使用ThreadLocal是否会造成内存泄漏
每一个线程对资源副本都有一个隐式引用:只要线程还在运行,只要ThreadLocal还是可以获取的。当一个线程运行借宿销毁时,所有的资源副本都是可以被来及回收的。所以理论上不会造成内存泄漏
- ThreadLocal对Thread的引用全部通过局部变量完成,而没有一个全局变量,而实际的资源副本则存储在Thread的自身的属性ThreadLocalMap中,这说明,其实ThreadLocal只是关联一个Thrad和其资源副本的桥梁,并且实际上Thread和资源副本的声明周期是紧密相连的,确实如ThreadLocal所说,在线程被回收的时候,其资源副本也会被回收,虽然ThreadLocal是静态的,但是它既不引用Thread,也不引用ThreadLocalMap。
- 如果多个线程并发访问的的对象实例只允许,也只能创建一个,那就没有别的办法了,老老实实使用同步机制来访问吧
线程变量---ThreadLocal类的更多相关文章
- 线程变量ThreadLocal的使用
我们有时候会通过token进行多次查询(猪:token是redis中的key),比如: 一次是在登录拦截器中,一次是在controller的业务中查询,这样存在性能和资源的浪费问题!!! 那么如何将拦 ...
- python 进程和线程-线程和线程变量ThreadLocal
线程 线程是由若干个进程组成的,所以一个进程至少包含一个线程:并且线程是操作系统直接支持的执行单元.多任务可以由多进程完成,也可由一个进程的多个线程来完成 Python的线程是真正的Posix Thr ...
- Java 类 ThreadLocal 本地线程变量
前言:工作中将要使用ThreadLocal,先学习总结一波.有不对的地方欢迎评论指出. 定义 ThreadLocal并不是一个Thread,而是Thread的局部变量.这些变量不同于它们的普通对应物, ...
- 深入理解java:2.4. 线程本地变量 java.lang.ThreadLocal类
ThreadLocal,很多人都叫它做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多. 可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那样每个线程可以访问自己内 ...
- 用ThreadLocal类实现线程安全的正确姿势
大家通常知道,ThreadLocal类可以帮助我们实现线程的安全性,这个类能使线程中的某个值与保存值的对象关联起来.ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量 ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, In ...
- 线程本地变量ThreadLocal
一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...
- ThreadLocal类及常用的线程安全类探究
1.ThreadLocal类 ThreadLocal是Thread Local Variable的简称,意思是线程局部变量.作用是为每一个使用该变量的线程都提供一个该变量的副本,使每一个线程都能独立操 ...
随机推荐
- php项目核心业务(增、删、改、查)(第三篇)
对增删改查数据库的封装 //php对数据库的封装 //Mysql_fetach($sql)函数查询所有的 function Mysql_fetach($sql){ $conn=mysqli_conne ...
- Mesos初体验-Mesos优势
一.Mesos优势 1.Mesos的核心是分布式集群资源分配,不负责任务调度,因而Mesos可以和其他集群协同工作 2.Mesos主要实现了分布式集群的管理系统中的资源分配功能,其他功能主要靠额外的组 ...
- python自动化开发-[第六天]-常用模块、面向对象
今日概要: 1.常用模块 - os模块 - random模块 - shutil模块 - hashlib模块 - pickle/json模块 - shelve模块 - configparser模块 - ...
- windows server 2008 远程连接
1.win2008如何开启远程桌面 原文:https://zhidao.baidu.com/question/745350052927250652.html 正常的开启操作: 在桌面上右点" ...
- 手把手教你通过Ambari新建Hadoop集群图解案例
手把手教你通过Ambari新建Hadoop集群图解案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 登陆系统之后,会看到Ambari空空如也的欢迎界面,接下来我们就需要介绍如何通 ...
- java socket / No buffer space available
s https://www.cnblogs.com/yiwangzhibujian/p/7107785.html Socket用在哪呢,主要用在进程间,网络间通信. https://www.cnblo ...
- iptables之端口限速
#iptables -A FORWARD -p tcp -m tcp --sport 10000 -m limit --limit 500/sec --limit-burst 1000 -j ACCE ...
- canvas svg webgl threejs d3js 的区别
canvas 绘制2D位图. Echarts是基于Canvas技术的可视化工具,底层封装了原生的JavaScript的绘图 API. canvas里面绘制的图形不能被引擎抓取,canvas中我们绘制图 ...
- Quartus II 中 Verilog 常见警告/错误汇总
Verilog 常见错误汇总 1.Found clock-sensitive change during active clock edge at time <time> on regis ...
- ES6 In Depth: Arrow functions
Arrows <script language="javascript"> <!-- document.bgColor = "brown"; ...