threadlocal

听说BAT这样的大公司,面试经常拿 ThreadLocal 考验求职者?(少侠留步)

这一生的挚爱 提交于 2020-02-28 07:19:56
今天,我们就来完完整整的学习下Threadlocal,争取以后再也不学了,因为看完今天这篇文章,你就对Threadlocal忘不了了! ThreadLocal 在线程中可以给我们提供一个线程内的本地局部变量,这样就可以减少在一个线程中因为多函数之间的操作导致共享变量传值的复杂性。 说白了,我们使用ThreadLocal可以做到在一个线程内随时随地的取用,而且与其他的线程互不干扰。 在一些特殊的情景中,应用ThreadLocal会带来极大的便利,不过很多人却搞不懂Threadlocal到底是个啥?在我们的面试中也经常会被问到Threadlocal,所以基于我们的实际应用以及应对面试,我们都有必要好好的学习下Threadlocal。 1、什么是Threadlocal? 我们既然要学习Threadlocal,那么我们先要知道它是个啥?我们从名字来看,Threadlocal意思就是线程本地的意思,官方是怎么定义它的,我们看看ThreadLocal的源码(基于jdk1.8)中对这个类的介绍: This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {

Java多线程与并发之ThreadLocal

戏子无情 提交于 2020-02-27 10:26:49
1. ThreadLocal是什么?使用场景 ThreadLocal简介 ThreadLocal是线程本地变量,可以为多线程的并发问题提供一种解决方式,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal使用场景 多个线程去获取一个共享变量时,要求获取的是这个变量的初始值的副本。每个线程存储这个变量的副本,对这个变量副本的改变不去影响变量本身。适用于多个线程依赖不同变量值完成操作的场景。比如: 多数据源的切换 spring声明式事务 2. ThreadLocal的使用案例 ThreadLocal类接口: void set(T value):设置当前线程的线程局部变量的值 T get():获取当前线程所对应的线程局部变量 void remove():删除当前线程局部变量的值,目的是为了减少内存的占用 T initialValue():该线程局部变量的初始值(默认值为null),该方法是一个protected的懒加载方法,线程第1次调用get()或set(T value)时才执行在,而且也是为了让子类覆盖而设计的。 public class ThreadLocalDemo { private static ThreadLocal

Java线程同步和并发第1部分

限于喜欢 提交于 2020-02-26 16:45:24
通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。我们将分两部分介绍Java中的线程同步,以更好地理解Java的内存模型。 介绍 Java线程同步和并发是复杂应用程序各个设计阶段中讨论最多的主题。 线程,同步技术有很多方面,它们可以在应用程序中实现高并发性。 多年来,CPU(多核处理器,寄存器,高速缓存存储器和主内存(RAM))的发展已导致通常是开发人员往往忽略的某些领域-例如线程上下文,上下文切换,变量可见性,JVM内存 型号与CPU内存型号。 在本系列中,我们将讨论Java内存模型的各个方面,包括它如何影响线程上下文,Java中实现并发的同步技术,竞争条件等。在本文中,我们将重点讨论线程,同步的概念 技术以及Java和我们的CPU的内存模型。 概括 在深入研究线程和同步这一主题之前,让我们快速回顾一下一些与线程相关的术语和概念。 1.Lock —锁是线程同步机制。 2. Java中的每个对象都有一个与之关联的固有锁。线程使用对象的监视器进行锁定或解锁。锁可以视为逻辑上是内存中对象标头的一部分的数据。有关监视器无法实现的扩展功能,请参见ReentrantLock。 3.Java中的每个对象都有同步方法,wait()和notify()[也notifyAll()]。任何调用这些方法的线程都使用其监视器获得该对象的锁

java源码学习---ThreadLocal

不想你离开。 提交于 2020-02-26 05:08:52
ThreadLocal 是一个线程安全副本,用于储存仅允许当前线程能访问/修改的值,不知从何时起看到了”线程安全“这种字眼就会不自觉想到性能问题,但是ThreadLocal是实现线程安全的另外一种方案"空间换时间"。 先看2个小Demo 使用ThreadLocal public class ThreadLoacalTest{ // 定义线程安全副本 private final static ThreadLocal<Integer> THREAD_NUMBER = new ThreadLocal<Integer>(); // 继承 Thread 重写 run() static class ThreadTest extends Thread{ @Override public void run() { for ( int i= 0 ; i < 3 ;i++){ // 如果 THREAD_NUMBER 为 null ,赋值 0 ,否则 +1 THREAD_NUMBER .set( THREAD_NUMBER .get() == null ? 0 : THREAD_NUMBER .get() + 1 ); // 打印信息 System. out .println(Thread. currentThread ().getName() + ":" + THREAD_NUMBER .get())

Envoy proxy 源代码解读 - Thread Local Storage (tls)

岁酱吖の 提交于 2020-02-25 21:24:28
关于 Envoy 线程模型,Envoy 作者的一遍文章写的很清楚,可以移步 这里 了解更多作者的设计思路,这是来自 原文 的线程模型图: 简而言之,Envoy 主线程(main thread)用来启动工作线程(worker thread)、管理 xDS 数据并同步至工作线程、统计数据 flush 等等;工作线程处理网络请求、路由、cluster 连接池等等。考虑到 xDS 会随时动态更新 listener/router/cluster 等信息,而实时处理数据的时候又会时刻查询此类信息,必然涉及到数据的线程安全问题,基于性能考虑,Envoy 做了无锁实现,主线程把需要同步的数据通过 Slot 推送给工作线程,由工作线程在沉寂期(quiescent period )完成数据更新,这样需要访问此类信息时就不需要加锁。以下是来自 原文 的 TLS 示意图: 下面以 Cluster 信息为例,分析源代码实现,理解 TLS 是如何工作的。 Envoy::ThreadLocal::Slot and Envoy::ThreadLocal::SlotAllocator 接口 Envoy::ThreadLocal::Slot 定义了 TLS 存储的基本单元 Slot (槽),定义如下: ** * An individual allocated TLS slot. When the slot is

并发系列(2)之 ThreadLocal 详解

*爱你&永不变心* 提交于 2020-02-25 08:14:15
本文将主要结合源码讲述 ThreadLocal 的使用场景和内部结构,以及 ThreadLocalMap 的内部结构;另外在阅读文本之前只好先了解一下引用和 HashMap 的相关知识,可以参考 Reference 框架概览 、 Reference 完全解读 、 HashMap 相关 ; 一、使用场景 通常情况下避免多线程问题有三种方法: 不使用共享状态变量; 状态变量为不可变的; 访问共享变量时使用同步; 而 ThreadLocal 则是通过每个线程独享状态变量的方式,即不使用共享状态变量,来消除多线程问题的,例如: @Slf4j public class TestThreadlocal { private static ThreadLocal<String> local = ThreadLocal.withInitial(() -> "init"); public static void main(String[] args) throws InterruptedException { Runnable r = new TT(); new Thread(r, "thread1").start(); Thread.sleep(2000); new Thread(r, "thread2").start(); log.info("exit"); } private static

ThreadLocal

…衆ロ難τιáo~ 提交于 2020-02-18 08:08:15
1.ThreadLocal 是什么?   ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,适用于各个线程不共享变量值的操作。 2.ThreadLocal 工作原理是什么?   ThreadLocal 原理:每个线程的内部都维护了一个 ThreadLocalMap,它是一个 Map(key,value)数据格式,key 是一个弱引用,也就是 ThreadLocal 本身,而 value 存的是线程变量的值。   也就是说 ThreadLocal 本身并不存储线程的变量值,它只是一个工具,用来维护线程内部的 Map,帮助存和取变量。   数据结构,如下图所             (图片来源于网络) 3.ThreadLocal 如何解决 Hash 冲突? 与 HashMap 不同,ThreadLocalMap 结构非常简单,没有 next 引用,也就是说 ThreadLocalMap 中解决 Hash 冲突的方式并非链表的方式,而是采用线性探测的方式。所谓线性探测,就是根据初始 key 的 hashcode 值确定元素在 table 数组中的位置,如果发现这个位置上已经被其他的 key 值占用,则利用固定的算法寻找一定步长的下个位置,依次判断

ThreadLocal

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-17 05:27:50
父线程生成的变量需要传递到子线程中进行使用 引入阿里提供的技术:TransmittableThreadLocal 解决线程本地变量在线程池之间的传递问题 github地址: https://github.com/alibaba/transmittable-thread-local 例1: 来源: CSDN 作者: 这些不会的 链接: https://blog.csdn.net/qq_25004825/article/details/104340272

多线程共享变量和 AsyncLocal

不羁的心 提交于 2020-02-16 16:32:15
>>返回《C# 并发编程》 1. 简介 2. 异步下的共享变量 3. 解析 AsyncLocal 3.1. IAsyncLocalValueMap 的实现 3.2. 结论 1. 简介 普通 共享变量: 在某个类上用静态属性的方式即可。 多线程 共享变量 希望能将这个变量的 共享范围 缩小到 单个线程 内 无关系 的B线程 无法访问 到A线程的值; [ThreadStatic] 特性、 ThreadLocal<T> 、 CallContext 、 AsyncLocal<T> 都具备这个特性。 例子: 由于 .NET Core 不再实现 CallContext,所以下列代码只能在 .NET Framework 中执行 class Program { //对照 private static string _normalStatic; [ThreadStatic] private static string _threadStatic; private static ThreadLocal<string> _threadLocal = new ThreadLocal<string>(); private static AsyncLocal<string> _asyncLocal = new AsyncLocal<string>(); static void Main(string[]

多线程-ThreadLocal

别等时光非礼了梦想. 提交于 2020-02-09 17:00:36
1、ThreadLocal是什么?   ThreadLocal这个类提供线程局部变量,这些变量与其他正常的变量不同之处在于每一个访问该变量的线程在其内部都有一个独立的初始化的变量副本。ThreadLocal实例变量通常采用private static在类中修饰。   只要ThreadLocal的变量能被访问,并且线程存货,那每个线程都会持有ThreadLocal变量的副本。当一个线程结束时,它所持有的所有ThreadLocal相对的实例副本都可被回收。   ThreadLocal和synchronized都是用于解决多线程并发访问,但是synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。synchronized利用锁机制,是变量或代码块在某一时刻只能被一个线程访问,而ThreadLocal为每一个线程都提供了变量的副本,使每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。 2、ThreadLocal的使用? 2.1使用ThreadLocal实现接口调用重试功能。 需求说明:http请求调用第三方应用的过程中可能会发生因为网络抖动而失败的情况,那这样我们就需要有重试机制,尽量保证调用成功。我们想到可用ThreadLocal做重试的功能。 Demo地址: https://gitee.com/burning