threadlocal

ThreadLocal

一笑奈何 提交于 2019-12-05 05:14:26
ThreadLocal,线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这 个结构被附带在线程上,可以通过set(T)方法来设置一个值,在当前线程下再通过get()方法获取到原先设置的值 ThreadLocal是保存线程本地化对象的容器。当运行于多线程环境的某个对象使用ThreadLocal维护变量时,ThredLocal为每个使用该变量的线程分配一个独立的变量副本。所以每个线程都可以独立地改变自己的副本,而不会影响到其他线程所对应的副本 InheritableThreadLocal继承于ThreadLocal,它自动为子线程复制一份从父线程那里继承而来的本地变量:在创建子线程时,子线程会接收所有可继承的线程本地变量的初始值。当必须将本地线程变量自动传给所有创建的子线程时,应尽可能使用InheritableThreadLocal 在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序缜密地分析什么时候对变量进行读写、什么时候需要锁定某个对象、什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大; 而ThreadLocal从另一个角度来解决多线程的并发访问。ThreadLocal为每个线程提供了一个独立的变量副本,从而隔离了多个线程对数据访问的冲突。因为每个线程都拥有自己的变量副本

Java 中的 ThreadLocal

荒凉一梦 提交于 2019-12-05 04:01:30
实现线程范围的共享变量。 JDK提供了ThreadLocal在一个线程内传递同一个对象 方法调用一定是同一个线程执行的 ThreadLocal一定要在finally中清除:因为当前线程执行完后有可能重新放入线程池中 可以把TheadLocal看成是全局Map<Thread,Object>:      (1)每个线程获取ThradLocal变量时,使用Thread自身作为Key      (2)ThreadLocal表示线程的“局部变量”,它确保每个线程的ThradLocal变量都是独立的      (3)ThreadLocal适合在一个线程的处理流程中保持上下文(避免同一参数在所有方法中传递)      (4)使用ThreadLocal要用try catch finally结构 package com.xuefei.util; public class ThreadLocalTest { //创建一个ThreadLocal对象 static ThreadLocal<String> threadLocal = new ThreadLocal<String>(); public static void main(String[] args) { //通过set方法给当前线程绑定一个指定的值 threadLocal.set("Bob"); //通过get方法随时获取到绑定的值

ThreadLocal<T> 源码解析

谁说我不能喝 提交于 2019-12-04 21:19:42
在activeJDBC框架内部的实现中看到了 ThreadLocal 这个类,记录下了每个线程独有的连接 private static final ThreadLocal<HashMap<String, Connection>> connectionsTL = new ThreadLocal<>(); 感觉是个知识点,就打开源码看看了。先看一下源码里的解释 This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. 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). 这个鸟文,瞎翻译一下,就是: 这个类提供了供线程专享的变量。这些变量不同与其它普通的变量

JAVA线程8

跟風遠走 提交于 2019-12-04 20:25:00
一、ThreadLocal简介 ThreadLocal并不是一个Thread,而是Thread的局部变量。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 二、为什么会出现ThreadLocal类 在java多线程并发访问共享变量时,为了线程安全,我们的做法可能是对多个线程访问进行同步控制。但是这样会降低系统的性能。在JDK 1.2的版本中就提供java.lang.ThreadLocal类,它为每一个线程都维护了一个变量,每个线程都有了自己独立的变量后,就没有了并发下的线程安全问题。ThreadLocal类是以空间来换取线程安全的一种策略。 三、ThreadLocal原理 ThreadLocal为每一个线程维护变量的副本实现思路: 在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。 四、实现一个简单的ThreadLocal SimpleThreadLocal.java public class SimpleThreadLocal { private Map valueMap = Collections.synchronizedMap(new HashMap()); public

线程局部变量ThreadLocal

你。 提交于 2019-12-04 13:46:41
一般我们考虑的是在线程间共享变量的风险。 有时可能要避免共享变量, 使用 ThreadLocal 辅助类为各个线程提供各自的实例。 ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yy-MM-dd")); 在一个给定线程中首次调用 get 时, 会调用 initialValue 方法。 在此之后, get 方法会返回 属于当前线程的那个实例。 可以使用 ThreadLocal 辅助类为各个线程提供一个单独的生成器, 不过 JDK7 还另外 提供了一个便利类。 只需要做以下调用: int random = ThreadLocalRandom.currentO.nextlnt(upperBound): ThreadLocalRandom.current() 调用会返回特定于当前线程的 Random 类实例。 来源: https://my.oschina.net/ytuan996/blog/3130194

Java多线程

坚强是说给别人听的谎言 提交于 2019-12-04 11:53:55
1. 多线程 image.png 新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。 运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务 就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。 休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。 终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。 2. 僵死进程 计算机的计算模型大部分是基于空间和时间来考虑的。僵死进程唯一占用的空间是pid空间,这个空间如果不能合理的应用就会造成浪费,之所以保留这个空间,是为了让父进程感知子进程已经终止这个行为。时间方面,这个感知过程是一个异步的过程。 3. 创建线程的方式 继承 Thread 类 实现 Runnable 接口 使用 Executor 框架 法一:继承Thread类 1.1定义一个类继承Thread 1.2重写run方法 1.3创建对象 1.4调用start方法开启线程 线程对象调用run()方法和start()方法区别? 调用run方法不开启线程,仅是对象调用方法

Java面试必问-ThreadLocal

*爱你&永不变心* 提交于 2019-12-04 08:41:10
前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: “知道ThreadLocal吗?” “讲讲你对ThreadLocal的理解” 当然了,也有面试官会慢慢引导到这个话题上,比如提问“在多线程环境下,如何防止自己的变量被其它线程篡改”,将主动权交给你自己,剩下的靠自己发挥。 那么ThreadLocal可以做什么,在了解它的应用场景之前,我们先看看它的实现原理,只有知道了实现原理,才好判断它是否符合自己的业务场景。 大家可以点击加群【JAVA架构知识学习讨论群】473984645,(如多你想跳槽换工作,但是技术又不够,或者工作遇到了瓶颈,我这里有一个Java的免费直播课程,讲的是高端的知识点,只要有1-5年的开发工作经验可以加群找我要课堂链接。)注意:是免费的 没有开发经验的误入。 ThreadLocal是什么 首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。 ThreadLocal<String> localName = new ThreadLocal(); localName.set("占小狼"); String name = localName.get();

Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?

六月ゝ 毕业季﹏ 提交于 2019-12-04 08:13:18
不知道一些同学有没有这种疑问,为什么Mybtis中要配置dataSource,Spring的事务中也要配置dataSource?那么Mybatis和Spring事务中用的Connection是同一个吗?我们常用配置如下 <!--会话工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> <!--spring事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!--使用注释事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> 看到没, sqlSessionFactory中配置了 dataSource, transactionManager也配置了 dataSource,我们来回忆一下

ThreadLocal Memory Leak in Java web application - Tomcat

房东的猫 提交于 2019-12-04 07:54:24
ThreadLocal variables are infamous for creating memory leaks. A memory leak in Java is amount of memory hold by object which are not in use and should have been garbage collected, but because of unintended strong references, they still live in Java heap space . There are many ways memory leak can be caused in Java but when this memory leak is caused due to ThreadLocal variable, it’s refereed as ThreadLocal memory leak. In our last post about ThreadLocal variable, we have seen How ThreadLocal variable can make SimpleDateFormat thread-safe and also raised point that in managed environment like

通过ThreadLocal解决servlet请求内部各类之间共享request等对象

柔情痞子 提交于 2019-12-04 07:42:03
场景如下:在java后台处理业务的时候,需要调用当前登录用户的一些信息,一般情况下的做法是,在登录的时候,把登录对象放到HttpSession对象中,在需要调用的时候,从request或者session对象中获取,但是这种方式直适用于servlet或者action中调用,只有此处才能获取到request或session对象。如果需要在一个被调用的业务类中获取,则无法行得通。 分析:其实只需要找到一种可以讲request对象缓存,同时又可以在业务类中获取,即可解决上述问题。面对此问题,我参考了下OSCHINA的源码, http://www.oschina.net/code/snippet_12_2 ,其中很关键的一段代码如下: private final static ThreadLocal<RequestContext> contexts = new ThreadLocal<RequestContext>(); 而这个ThreadLocal类究竟是干什么用的呢,看下面这篇文章: http://www.iteye.com/topic/103804 文章内容将的很清楚,关于 ThreadLocal的用法,甚至举了hibernate中session管理的例子,咋一看,确实很容易搞晕,但是从下面的有一个回复内容,可以很清晰的明白这个类能干嘛: 或者可以自己定义一个静态的map