threadlocal

彻底理解ThreadLocal

白昼怎懂夜的黑 提交于 2019-11-30 01:30:52
知其然 synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程访问到的,都是同一份变量的内容。为了防止在多线程访问的过程中,可能会出现的并发错误。不得不对多个线程的访问进行同步,这样也就意味着,多个线程必须先后对变量的值进行访问或者修改,这是一种以延长访问时间来换取线程安全性的策略。 而ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,那就没有任何必要对这些线程进行同步,它们也能最大限度的由CPU调度,并发执行。并且由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,变量被彻底封闭在每个访问的线程中,并发错误出现的可能也完全消除了。对比前一种方案,这是一种以空间来换取线程安全性的策略。 来看一个运用ThreadLocal来实现数据库连接Connection对象线程隔离的例子。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { private static ThreadLocal<Connection> connectionHolder = new

浅谈Java中的ThreadLocal的多线程应用问题

走远了吗. 提交于 2019-11-30 01:29:56
什么是ThreadLocal?首先要说明的一点是ThreadLocal并不是一个Thread,而是Thread的局部变量。在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。下面我们就来看看ThreadLocal的初步内容: 多线程安全性解决方案 ①进行同步控制synchronized 效率降低 并发变同步(串行) ②使用ThreadLocal 本地线程 每个线程一个变量副本(各不相干) 两种线程安全方案的差异 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而 ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队 访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。 扩展问题 我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中, 绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean

ThreadLocal的使用

我与影子孤独终老i 提交于 2019-11-30 00:21:20
ThreadLocal的特点是每一个线程对应的对象都只与当前线程有关,当在全局声明一个使用了ThreadLocal的对象时,在每个线程调用它时,都会有一个自己线程对应的拷贝,而赋值则是由 def initialValue() 或set方法来完成的 我们要实现了一个Protocol层,它内部会保留一个socket连接 class ThreadLocalProtocol { val protocol = new ThreadLocal[ZTMultiplexedProtocol]() { override def initialValue(): ZTMultiplexedProtocol = { val zmp = ZLineStatusClient.getZmp zmp.openTTransport() zmp } } def getProtocol(): ZTMultiplexedProtocol = { protocol.get() } } 我们在主线程进行 lazy val threadLocalProtocol = new ThreadLocalProtocol 这里用不用lazy应该是一样的,因为ThreadLocal.get()调用时,才会延迟加载对象,这里是ZTMultiplexedProtocol,我们来看看jdk源码 /** * Returns the value

ThreadLocal一些感悟记录

寵の児 提交于 2019-11-29 22:56:36
如果有个变量需要和线程的生命周期绑定,此时可以用ThreadLocal; ThreadLocal的使用有set和get方法 此时有个data,用set放入线程,实质上是放入ThreadLocalMap中,key是当前的ThreadLocal,value是data; 每一个Thread 持有一个ThreadLocalMap, 先用ThreadLocal获取当前的Thread的ThreadLocalMap进行存储。 来源: CSDN 作者: 热血程序汪 链接: https://blog.csdn.net/feiyu07/article/details/103245661

了解ThreadLolocal

我的未来我决定 提交于 2019-11-29 22:00:37
ThreadLocal(线程局部变量) ThreadLocal提供了一种访问某个变量的特殊方式:访问的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是当前线程私有的,这就是所谓的线程隔离。 如果要使用ThreadLocal,通常定义为private static 类型,在我看来最好定义为private static final类型。 使用 /** * ThreadLocal在线程A创建的时候,已经为你创建了一个DateFormat,这个DateFormat在该线程中共享。 * 在线程B开启的时候会创建另外一个DateFormat,那么ThreadLocal和自己new对象的区别呢?ThreadLocal在该线程中的所有方法都可以使用,不需要传递 */ public class ThreadLocalTest { public static void main(String[] args) { System.out.println(DateUtil.THREAD_LOCAL.get().format(new Date())); } } ​ class DateUtil { public static final ThreadLocal<DateFormat> THREAD_LOCAL = new ThreadLocal<DateFormat>() {

Java并发编程:深入剖析ThreadLocal

假装没事ソ 提交于 2019-11-29 19:22:08
一、对ThreadLocal的理解   ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。 ThreadLocal的官方API解释为: "该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。" 大概的意思有两点: 1、ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是一致的,这就是所谓的线程隔离。 2、如果要使用ThreadLocal,通常定义为private static类型,在我看来最好是定义为private static final类型。 很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路

ThreadLocal

被刻印的时光 ゝ 提交于 2019-11-29 18:21:45
一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问

java多线程中ThreadLocal的相关知识

本小妞迷上赌 提交于 2019-11-29 12:06:16
ThreadLocal ThreadLocal会为每一个调用它的线程创建一个变量副本,每个线程使用自己的副本并对其进行操作,不会影响到其他的线程的变量副本的值。 方法: set:设置该线程ThreadLocal副本中的值 get:获取该线程ThreadLocal副本中的值 initialValue:可以在创建ThreadLocal时重写该方法,设置初值。 withInitial:设置ThreadLocal的初值。 ThreadLocal local = new ThreadLocal<>(){ protected Integer initialValue(){ return 200; } } ThreadLocal local = ThreadLocal.withInitial(()->200); 例子 public class test{ private static ThreadLocal<Integer> threadlocal = new ThreadLocal<>(); public static void main(String[] args){ //设置mian线程中ThreadLocal的值 threadlocal.set(2); System.out.println(Thread.currentThread().getName()+"->"+thraedlocal

Classloader leaks

三世轮回 提交于 2019-11-29 09:45:19
原博:http://java.jiderhamn.se/2012/01/29/classloader-leaks-iv-threadlocal-dangers-and-why-threadglobal-may-have-been-a-more-appropriate-name 以下记录,主要是为了以后复习使用。 1.Thread Local 引起的Classloader leaks ThreadLocal主要是解决在多线程中,实现线程变量安全的方法 ThreadLocal使用后,需要删除,如果没有删除,会导致ThreadLocal无法回收,它内部使用了ThreadLocalMap,这个Map在jvm中是软引用,不一定会被回收(只有在内存紧张的时候会回收) try { threadLocal.set(value); ... } finally { threadLocal.remove(); } 2.解决这个问题可以使用Servlet过滤器 public class ThreadLocalLeakPreventionFilter implements javax.servlet.Filter { private ThreadLocal[] offendingThreadLocals; public void init(FilterConfig filterConfig) throws

ThreadLocal 基础知识

混江龙づ霸主 提交于 2019-11-28 23:06:44
ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象。当工作于多线程中的对象使用 ThreadLocal维护变量时, ThreadLocal为每个使用该变量的线程分配一个独立的变量副本。 所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本,这个变量就像是线程的本地变量,这也是类名中“ Local '所要表达的意思。 线程局部变量在别的语言中也有,并且在语法层面实现,在java中没有提供语言级支持,而是一种变通的方法,通过 ThreadLocal的类提供支持,所以,在java中编写线程局部变量的代码相对来说要笨拙一些 因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)设置当前线程的线程局部变量的值。 public Object get()该方法返回当前线程所对应的线程局部变量。 public void remove()将当前线程局部变量的值删除