为什么jdk源码推荐ThreadLocal使用static
ThreadLocal是线程私有变量,本身是解决多线程环境线程安全,可以说单线程实际上没必要使用。
既然多线程环境本身不使用static,那么又怎么会线程不安全。所以这个问题本身并不是问题,只是有人没有理解ThreadLocal的真正使用场景,所以有此疑问。
看看jdk源码推荐ThreadLocal使用static吧:
/*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {@code get} or {@code set} method) has its own, independently initialized* copy of the variable. {@code ThreadLocal} instances are typically private* static fields in classes that wish to associate state with a thread (e.g.,* a user ID or Transaction ID).** <p>For example, the class below generates unique identifiers local to each* thread.* A thread's id is assigned the first time it invokes {@code ThreadId.get()}* and remains unchanged on subsequent calls.* <pre>* import java.util.concurrent.atomic.AtomicInteger;** public class ThreadId {* // Atomic integer containing the next thread ID to be assigned* private static final AtomicInteger nextId = new AtomicInteger(0);** // Thread local variable containing each thread's ID* private 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 necessary* public static int get() {* return threadId.get();* }* }* </pre>* <p>Each thread holds an implicit reference to its copy of a thread-local* variable as long as the thread is alive and the {@code ThreadLocal}* instance is accessible; after a thread goes away, all of its copies of* thread-local instances are subject to garbage collection (unless other* references to these copies exist).** @author Josh Bloch and Doug Lea* @since 1.2*/
public class ThreadLocal<T> {/*** ThreadLocals rely on per-thread linear-probe hash maps attached* to each thread (Thread.threadLocals and* inheritableThreadLocals). The ThreadLocal objects act as keys,* searched via threadLocalHashCode. This is a custom hash code* (useful only within ThreadLocalMaps) that eliminates collisions* in the common case where consecutively constructed ThreadLocals* are used by the same threads, while remaining well-behaved in* less common cases.*/
这个是Josh Bloch和Doug Lea写的,再看看他们的著作:《Java并发编程实战》
再看看jdk中的官方文档:
已经说的很明白了,再看看其他答案吧:
按照ThreadLocal类的定义
此类提供线程局部变量。这些变量与普通变量不同,每个访问一个线程(通过其get或set方法)的线程都有其自己的,独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。
这意味着说2个线程t1
并t2
执行someBMethod()
,它们分别结束设置x1
&x2
(的实例X
)。现在,当t1
come并执行时,someCMethod()
它会获取x1
(它是由它自己设置的)和gets 。t2
x2
换句话说,只有一个静态实例是安全的ThreadLocal
,因为在内部调用时它会执行类似的操作set
Java 源代码,
java.lang.Thread Class
包含一个实例变量,如下所示。ThreadLocal.ThreadLocalMap threadLocals = null;
因为threadLocals
变量是非静态的,所以应用程序中的每个线程(即Thread Class的每个实例)将拥有它自己的threadLocals映射副本。
该映射的键是当前 ThreadLocal实例,而value是您作为参数传递给ThreadLocal.set()的值。
当您尝试在内部获取 as值时
ThreadLocal.get()
,它将从Current Thread的ThreadLocalMap获取。
简而言之,您是从当前线程对象获取&设置值,而不是从ThreadLocal对象获取&设置值。
相关文章:

C与C++之间相互调用
1、导出C函数以用于C或C的项目 如果使用C语言编写的DLL,希望从中导出函数给C或C的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,…
【MATLAB】三维图形的绘制mesh
步骤如下: (1)确定自变量x和y的取值范围和取值间隔 x x1 :dx :x2 , y y1 : dy : y2 (2)构成xoy平面上的自变量采样“格点”矩阵 ①利用格点矩阵的原理生成矩阵。 xx1:dx:x2; yy1:dy:y2; Xones(size(y))*x; Yy*o…

ORA-01919: role 'PLUSTRACE' does not exist
环境:Oracle 10g,11g.现象:在一次迁移测试中,发现有这样的角色赋权会报错不存在: SYSorcl> grant PLUSTRACE to jingyu; grant PLUSTRACE to jingyu* ERROR at line 1: ORA-01919: role PLUSTRACE does not exist 查询发现这个…

Java反射以及应用
需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有、共有、保护) getField 仅能获取类(及其父类可以自己测试) public属性…

【MATLAB】雅可比矩阵jacobi matrix
参考页面: https://baike.baidu.com/item/%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5/10753754?fraladdin#1 在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。 由球坐标系到直角坐标系的转…

Laravel:使用Migrations
1、首先利用artisan创建一个可迁移的数据表模板,该命令运行后会在database/migrations目录下生成一个文件 php artisan make:migration create_fees_count_table --createfees_count 2、生成的文件包含up和down两个方法,其中up中是包含了添加表ÿ…

基于libevent和unix domain socket的本地server
https://www.pacificsimplicity.ca/blog/libevent-echo-server-tutorial 根据这一篇写一个最简单的demo。然后开始写client。 client调优 client最初的代码如下: 1 #include <sys/socket.h>2 #include <sys/un.h>3 #include <stdio.h>4 #include …

软件体系架构模式之一什么是软件架构模式
什么是软件架构模式 计划启动未开发的软件项目?然后选择正确的架构模式将对项目的结果起关键作用。选择市场上最流行或最新的技术并不总是意味着会带来最好的结果。但是,选择最合适的解决方案将为行之有效的问题和反复出现的问题提供可靠的解决方案。 …

HP 服务器 iLO 远程控制软件 介绍
iLO了解:iLO 是一组芯片,内部是vxworks的嵌入操作系统,在服务器的背后有一个标准RJ45口对外连接生产用交换机或者带外管理的交换机。iLO 全名是 Integrated Lights-out,它是惠普某些型号的服务器上集成的远程管理端口,它能够允许用…
【MATLAB】数据分析之数据插值
插值:求过已知有限个数据点的近似函数。 区别于拟合: 拟合:已知有限个数据点求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。 基本常用的插值方法:拉格朗日多项式插值&…

迈斯!啊呸~数学
1.数论 快速幂 int po(int x,int y) {int ans1;while(y){if(y%21)ans1ll*ans*x%p;x1ll*x*x%p;y/2;}return ans; } 乘法逆元(保证模域p与求逆元的数互质) po(a,p-2);//a为需要求逆元的数 扩展欧几里得(exgcd) #include<cstdio&g…

软件体系架构模式之二分层体系结构
分层体系结构模式是n层模式,其中组件被组织在水平层中。这是设计大多数软件的传统方法,并且具有独立性。这意味着所有组件都是互连的,但彼此之间不依赖。 图1:分层架构 在此体系结构中有四层,其中每一层在模块和其中的…

linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,最安全的状态是到服务器的Console上面操作,并且拔掉网线,或者可以使用--skip-networking限制只能从本地连接2.修改MySQL的登录设置: # vim /etc/my.cnf在[mysqld]的段中加上…
【Python】turtle库的小应用
心血来潮,哈哈哈,画的不好,请多见谅 大家如果想要尝试turtle库,可以借鉴: https://www.cnblogs.com/nowgood/p/turtle.html 导入库,我的pycharm里可以直接使用,哈哈哈,不行就pip…

[转]MySQL修改时区的方法小结
本文转自:https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令行模式、配置文件方式及代码方式,需要的朋友可以参考下 方法一:通过mysql命令行模式下动态修改 1.1 查…

swift轮播图代码
import UIKit private let CycleCellID "CycleCellID" class BannerCycleView: UIView { var layout : UICollectionViewFlowLayout! var collectionView :UICollectionView! var pageContol : UIPageControl? var cycleTimer : Timer? let timeInterval : TimeI…

软件体系架构模式之三微内核体系架构
当您的软件系统或产品包含许多与外部实体的集成点时,微内核体系结构模式将非常有用。最重要的是,您将无法准确判断出将来将哪些实体集成到您的系统中。可以将微内核架构模式识别为基于插件的模式。。也称为插件架构模式,它由两个主要组件组成…
【MATLAB】交互式绘图(ginput,gtext,zoom)
1、ginput指令: [x,y]ginput(n) %(其功能是用鼠标从二维图形中获取n个点的数据坐标) x-8*pi:pi/100:8*pi; y1sin(x); y24*sin(x/4); plot(x,y1,r-,x,y2,k-); legend(sin(x),4sin(x/4)); grid on; [x,y]ginput(8); %在下方命令窗…

【斗医】【18】Web应用开发20天
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1544928 本文通过获取首页内容来讲解Web页面拖拽获取当前页数据,功能类似在google查看图…

数据库和缓存一致性的问题
经常看到有人问怎么解决数据库和缓存一致性的问题,这个问题我觉得是不要去解决。 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元。 用户更新数据库的同时双写缓存。 1.双写不删 写库充值10元>>>返回成功 ----- 时间间隔 <<<…
【MATLAB】数据分析之求函数的极限(limit)
在MATLAB中采用limit函数求某个具体函数的极限,其调用格式如下: limit(expr,x,a):当xa时,对函数expr求极限,返回值为函数极限。limit(expr):默认当x0时,对函数expr求极限,返回值为函…

Spring Boot集成Swagger导入YApi@无界编程
接口APi开发现状 现在开发接口都要在类似YApi上写文档,这样方便不同的团队之间协作,同步更新接口,提高效率。 但是如果接口很多,你一个个手工在YApi去录入无疑效率很低。 如果是使用Spring Boot集成Swagger可以直接导入YApi非常…
【MATLAB】数据分析之函数数值积分
一、数值积分问题的数学表达 称为积分节点,称为求积系数。右端公式称为左端定积分的某个数值积分。MATLAB支持三重以下的积分运算。分别为: 在计算积分时,要求积分区间是确定的。 二、一元函数的数值积分 1、quad函数:采用遍历的…

c++对象切片
什么事对象切片:c在将一个派生类转换为基类的过程中,派生类的一部分将被基类接收不到,只能留下基类大小的对象。传值调用的切片:#include<iostream> using namespace std; class Base { public: virtual void func1() { cou…

javascript数据结构与算法-队列
定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为…

Oracle学习笔记十三 触发器
2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用。 触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供…

使用Notepad++比较文件的差异
有时候需要比较两个文件的差异部分,如果不在git里可以使用Notepad的插件。 在Notepad中安装Compare插件 打开NotePad,点击工具栏上的插件--Plugin Manager--Show Plugin Manager,选中Compare 然后安装。 比如下看两个线程堆栈的差异…
【MATLAB】将向量表示的多项式用字符串输出的通用函数示例
%创建一个名为pprintf的M文件 function s pprintf(p) %UNTITLED7 此处显示有关此函数的摘要 % 此处显示详细说明 if nargin>1error(Too much input arguments); end while(p(1)0)p1[]; end llength(p); if l0s0; elseif l1snum2str(p(1)); elseif l2s strcat(num2str(p(…

30秒或更短的时间内弄懂的有用CSS代码片段
今天无意间看到这个,真的很牛逼,记录下中文网: caibaojian.com/30-seconds-…转载于:https://juejin.im/post/5bf278a85188255e9b61a226
【MATLAB】数据分析之多项式及其函数
1、多项式的表达式和创建 MATLAB中使用一维向量来表示多项式。将多项式按照降幂次序存放在向量中。 多项式就可以用向量 [2 3 5 0 1]来表示。 2、多项式求根 >> p[1 2 1]p 1 2 1>> r roots(p)r -1-13、由根创建多项式 >> r [2;3]r 23>>…