threadlocal

ThreadLocal和InheritableThreadLocal的使用

非 Y 不嫁゛ 提交于 2019-12-06 15:45:00
今天在看一个开源项目的时候注意到InheritableThreadLocal类,之前接触的一般都是ThreadLocal类。ThreadLocal这个类大家都比较熟悉。 一句话解释就是这个ThreadLocal存放的是各线程独立的“对象数据”,各线程互不干扰,也不能共享访问,避免并发问题。而InheritableThreadLocal要解决的是要在所有线程中全局共享同一个对象, 所以在当前线程上创建一个新的线程实例Thread时,会把这些线程变量从当前线程传递给新的线程实例(把父线程的数据传递给新线程)。(此时线程变量不再线程安全,需要考虑线程安全问题) ,之前面试的时候问道多线程之间怎样共享数据,方式其实有很多,比如: 1、共享存储系统保存对象(redis缓存、文件形式等) 2、创建共享对象通过值传递给新的线程 3、静态变量的形式 4、多线程共用 Runnable对象 现在看来是用InheritableThreadLocal也是不错的一种方式。 ThreadLocal和InheritableThreadLocal的区别就是: InheritableThreadLocal可以获取父级线程的内容,而ThreadLocal不能。 使用方式及源码参考: public class ThreadLocalContext extends InheritableThreadLocal

java线程——线程局部变量

让人想犯罪 __ 提交于 2019-12-06 10:37:27
一,线程局部变量ThreadLocal的作用   用于实现线程内部的数据共享, 既对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,在另一个线程访问的时候,访问的由是另一份数据 。   每个线程调用ThreadLocal对象的set方法时,就相当于向内部Map集合中增加一条记录。   Map(key,value)key相当于当前的线程,value相当于set()传递进来的值。   ThreadLocal<T> threadLocal =new ThreadLocal<T>(); T是set()方法传进来的值类型。 问题:一个ThreadLocal中只能存放一个变量,既其中只能存放一个数据,如果由两个数据,可以定义两个ThreadLocal,但是如果有多个呢?例如100个?   解决方法是定义一个对象来存放这100个数据,然后在ThreadLocal中存放这个对象。 二,在 Runnable 中创建 ThreadLocal 在线程类内部创建 ThreadLocal,基本步骤如下:   ①、在多线程的类(如 ThreadDemo 类)中,创建一个 ThreadLocal 对象 threadXxx,用来保存线程间需要隔离处理的对象 xxx。   ②、在 ThreadDemo 类中,创建一个获取要隔离访问的数据的方法 getXxx(),在方法中判断,若ThreadLocal

java之线程

馋奶兔 提交于 2019-12-06 10:08:35
1、线程与进程    线程(thread):线程是运行的程序单元,依托于进程存在。一个进程可以包含多个线程,多线程可以共享一块内存空间和一组系统资源。   进程(processes):进程是程序的一次动态执行,通常每一个进程都拥有自己独立的内存空间和系统资源 2、线程的创建 继承Thread类,重写run方法 实现runnable接口,实现run方法 实现Callable接口,实现call方法 lambda表达式创建线程   1)、继承thread类,代码实现; class ThreadTest{ public static void main(String[] args) throws Exception{ MyThread thresd = new MyThread(); thread.start(); } } class MyThread extends Thread{ @Override public void run(){ System.out.println("123"): } }    2)、实现runnable接口,代码实现 class ThreadTest{ publiic static void main(String[] args){ MyRunnable runnable = new MyRunnable (); new Thread(runnable)

threadlocal原理分析

寵の児 提交于 2019-12-06 09:37:07
简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。引自@ 枫之逆 人们常说,锁是一种以时间换空间的机制,而ThreadLocal正好是以空间换时间的。 和锁的比较 为什么要先强调这一点,因为从简介上看,容易使人们联想到ThreadLocal似乎是一种解决Java多线程环境中线程同步与线程安全方法,其实不然,这里要设计到两个概念:线程安全,线程同步,事实上,ThreadLocal只解决线程安全的问题,并不能解决线程同步的问题,这也造成在刚学习的时候,我总是在苦想,ThreadLocal既然为每个线程拷贝一份变量,那怎么再进行同步呢?查了很多资料后才想明白,ThreadLocal并不是用来解决线程同步的,所以它与锁可以说是没有什么关系的,彼此各有所长,不能代替

ThreadLocal讲解

旧时模样 提交于 2019-12-06 04:29:59
ThreadLocal的作用是什么? 如果定义一个变量 x=1,如果三个线程同时访问x ,它们公用一个变量,用的是同一个x; 但如果把这个变量放到ThreadLocal里面,线程1去用x,他就会把x复制一份,给线程1用, 线程1如果删掉或修改x,之前的x不动, 修改或者删除的只是副本里的x ;同样,线程2或3去拿x,也是拿一个副本,删掉或 修改都不影响ThreadLocal类的x。 来源: https://www.cnblogs.com/qzhc/p/11961859.html

杂记8

烂漫一生 提交于 2019-12-06 03:25:30
solt vue中的插槽,可用于显示一些文本 <template slot="title"><i class="el-icon-setting"></i>比赛</template> vue-property-decorator -Threadlocal 线程内部的存储类,可以在指定内存内存储数据,存储后,只有指定线程可以得到存储数据。 static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get() spring security Authentication(认证):是谁 和 Authorization(授权,也叫访问控制):能做什么 ExceptionHandler 程序运行中可能遇到异常,可以使用@ExceptionHandler注释确定一个全局的异常处理方法,当出现异常时会自动被调用 @ResponseBody修饰后,当异常出现后会替换返回信息主体 @ExceptionHandler(Exception.class) @ResponseBody public RestResponse handler(Exception e) { logger.error(e.getMessage(), e); return new

自己动手写一个服务网关-java

安稳与你 提交于 2019-12-05 14:33:54
自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情况下,我们的服务是直接暴露给服务调用方。当调用方增多,势必需要添加定制化访问权限、校验等逻辑。当添加API网关后,再第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制。 本文所实现的网关源码抄袭了---Oh,不对,是借鉴。借鉴了Zuul网关的源码,提炼出其核心思路,实现了一套简单的网关源码,博主将其改名为Eatuul。 题外话 本文是业内能搜到的第一篇自己动手实现网关的文章。博主写的手把手系列的文章,目的是在以最简单的方式,揭露出中间件的核心原理,让读者能够迅速了解实现的核心。需要说明的是,这不是源码分析系列的文章,因此写出来的代码,省去了一些复杂的内容,毕竟大家能理解到该中间件的核心原理即可。如果想看源码分析系列的,请关注博主,后期会将spring、spring boot、dubbo、mybatis等开源框架一一揭示。 正文 设计思路 先大致说一下,就是定义一个Servlet接收请求。然后经过preFilter(封装请求参数),routeFilter(转发请求),postFilter(输出内容)。三个过滤器之间,共享request

【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

大兔子大兔子 提交于 2019-12-05 13:46:24
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。觉得内容不错再 Star!)。 另外推荐一篇原创: 终极推荐!可能是最适合你的Java学习路线+方法+网站+书籍推荐! Java 并发进阶常见面试题总结 1. synchronized 关键字 1.1. 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化,所以现在的 synchronized

多线程之美2一ThreadLocal源代码分析

无人久伴 提交于 2019-12-05 11:32:51
1、应用场景及作用 -1作用、ThreadLocal 为了实现线程之间数据隔离,每个线程中有独立的变量副本,操作互不干扰。区别于线程同步中,同步在为了保证正确使用同一个共享变量,需要加锁。 -2应用场景: 1)可以对一次请求过程,做一个过程日志追踪。如slf4j的MDC组件的使用,可以在日志中每次请求过程加key,方便定位一次请求流程问题。 2)解决线程中全局数据传值问题。 2、结构关系 要理清ThreadLocal的原理作用,可以先了解Thread, ThreadLocal, ThreadLocalMap三者之间的关系。简单类图关系如下 2.1、三者关系类图 1、Thread 类中有ThreadLocalMap类型的成员变量 threadLocals 2、ThreadLocalMap是ThreadLocal的静态内部类 3、Thread 与 ThreadLocal怎么关联? 线程对象中threadLocals中存储的键值对 key--> ThreadLocal对象,value --> 线程需要保存的变量值 2.2、ThreadLocalMap结构图 ThreadLocalMap 底层实现实质是一个Entry对象数组, 默认容量是16,在存储元素到数组中,自己实现了一个算法来寻址(计算数组下标), 与Map集合中的HashMap有所不同。 Entry对象中

Alibaba-技术专区-开源项目之TransmittableThreadLocal

馋奶兔 提交于 2019-12-05 10:10:01
   1.简介   TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用 2、使用场景 分布式跟踪系统 应用容器或上层框架跨应用代码给下层SDK传递信息 日志收集记录系统上下文 3、简单分析使用 JDK 的 InheritableThreadLocal 类可以完成父线程到子线程的值传递。但对于使用线程池等会池化复用线程的组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的 ThreadLocal 值传递已经没有意义,应用需要的实际上是把 任务提交给线程池时的 ThreadLocal 值传递到 任务执行时。 下面分析下 InheritableThreadLoc InheritableThreadLocal类重写了ThreadLocal的3个函数: /** * 该函数在父线程创建子线程,向子线程复制InheritableThreadLocal变量时使用 */ protected T childValue(T parentValue) {   return