threadlocal

ThreadLocal使用方法

匿名 (未验证) 提交于 2019-12-03 00:26:01
ThreadLocal:用于实现线程内部的数据共享叫线程共享(对于同一个线程内部数据一致),即相同的一段代码 多个线程来执行 ,每个线程使用的数据只与当前线程有关。 1.当存储的为基本变量或者包装对象时 [java] view plain copy package /** public class public static new public static void /*创建两个线程*/ for ( int 0 2 new new @Override public void 10 /*存入当前线程独有的值*/ new new static class public void /*取得当前线程所需要的值*/ static class public void /*取得当前线程所需要的值*/ 2.当存储的为对象时 就是数据集合 比如前台传过来的参数,每一个人传过来的 都是这个人独有的,才能保证数据准确性,抽取业务数据为一个对象 [java] view plain copy class private static new private public static if ( null //当前线程无绑定的对象时,直接绑定一个新的对象 new return private public return public void this 把ThreadLocal 放在业务对象里面提现高内聚

源码解读 ・ ThreadLocal

匿名 (未验证) 提交于 2019-12-03 00:22:01
第一次知道ThreadLocal是在看Looper源码的时候知道的,那时候只知道它的作用是让数据在各个线程单独保持一份,互不干扰,也一直没有去研究它的具体实现。昨天下班前粗略地看了一遍,我心里想的是“这玩意儿真的是太麻烦了,要是我的话,直接在线程里维护一个Object数组就能实现这个功能啊”。然后下了班回到家,我又仔仔细细的看了一遍,果然大佬还是你大佬,我还是太天真了。 在正式读代码前先简单介绍ThreadLocal的实现方式。每个线程都会有一个ThreadLocalMap,只有在使用到ThreadLocal的时候才会初始化ThreadLocalMap。需要存储的对象T会被放到Entry里面存储在ThreadLocalMap的数组中,Entry是一个键值对的数据结构,ThreadLocal实例为key,T为value。在使用的过程中,ThreadLocal会先找到当前线程的ThreadLocalMap,根据ThreadLocal的散列值找到存储的位置执行get方法或者set方法。 下面我画了一张图来说明。当定义ThreadLocal<A>对象,在不同线程中保存的A实例对象分别保存在各自线程的ThreadLocalMap中。 老样子,还是由一段简单的代码开始深入源码 final ThreadLocal < String > threadLocal = new ThreadLocal

ThreadLocal原理及内存泄露预防

匿名 (未验证) 提交于 2019-12-03 00:19:01
参阅: http://www.importnew.com/22039.html ThreadLocal 提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现。常见的ThreadLocal用法有: - 存储单个线程上下文信息。比如存储id等; - 使变量线程安全。变量既然成为了每个线程内部的局部变量,自然就不会存在并发问题了; - 减少参数传递。比如做一个trace工具,能够输出工程从开始到结束的整个一次处理过程中所有的信息,从而方便debug。由于需要在工程各处随时取用,可放入ThreadLocal。 ThreadLocal里类型的变量,其实是放入了当前Thread里。每个Thread都有一个 {@link Thread#threadLocals} ,它是一个map: {@link java.lang.ThreadLocal.ThreadLocalMap} 。这个map的entry是 {@link java.lang.ThreadLocal.ThreadLocalMap.Entry} ,具体的key和value类型分别是 {@link ThreadLocal} 和 {@link Object} 。 (注:实际是ThreadLocal的弱引用 WeakReference<ThreadLocal<?>> ,但可以先简单理解为ThreadLocal。)

ThreadLocal

匿名 (未验证) 提交于 2019-12-03 00:14:01
在阅读Handler源码时发现了这么一个东西,本想直混在其他博客中一笔带过,但仔细想了下这个东西还是蛮重要的,于是开了这篇博客。 ThreadLocal threadlocal使用方法很简单 static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get() threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,官方解释如下。 /** * 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

ThreadLocal

匿名 (未验证) 提交于 2019-12-02 23:55:01
import java.util.Random; /** * ThreadLocal类及应用技巧 * ******************************************************************* * 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key * 分别是各自的线程,values是各自的set方法穿进去的值。在线程结束时可以调用ThreadLocal.clear(); * 方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量。 * 实现对ThreadLocal变量的封装,让外界不要直接操作ThreadLocal变量 * 对基本类型的数据的封装,这种应用相对少见。 * 对对象类型的数据的封装,比较常见,即让某个类针对不同线程分别创建一个独立的实例对象。 * 总结: * 一个ThreadLocal代表一个变量,故其中里只能放一个数据,你有两个变量都要线程范围内 * 共享,则要定义两个ThreadLocal对象。如果有一百个变量要线程共享呢?把ThreadLocal封装 * 到一个单例类中。 * * Struts2中的思想就是ThreadLocal模式 * * *****************************************

ThreadLocal

匿名 (未验证) 提交于 2019-12-02 23:47:01
1 、定义 threadLocal:更好理解为threadLocalvalue,用于存储本线程中变量,该变量对其他线程而言是不可见的 2 、局限 线程之间不能做到数据共享,不管是不是同一个对象的线程还是不同对象的线程,不同线程之间不能做到数据共享,从而无法解决共享对象的更新问题;每个线程往ThreadLocal中读、写数据线程之间都是隔离的,互相之间互不影响 局限相关代码示例: package com.threadlocal2; public class ThreadLocalT implements Runnable { //ThreadLocal变量初始化 private static ThreadLocal<Integer> ticket=new ThreadLocal<Integer>(){ public Integer initialValue() { System.out.println("调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!"); return 3; } }; public void run(){ while (true){ if(ticket.get()>0){ ticket.set(ticket.get()-1); System.out.println(Thread.currentThread().getName()

ThreadLocal

你。 提交于 2019-12-02 23:32:14
在阅读Handler源码时发现了这么一个东西,本想直混在其他博客中一笔带过,但仔细想了下这个东西还是蛮重要的,于是开了这篇博客。 ThreadLocal threadlocal使用方法很简单 static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get() threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,官方解释如下。 /** * 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

Java并发编程:深入剖析ThreadLocal

匿名 (未验证) 提交于 2019-12-02 21:53:52
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。   以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3920407.html   ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。   这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。   我们还是先来看一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class ConnectionManager { private static null ; public static Connection openConnection() { if null ){

Java并发线程之ThreadLocal使用严重 [http-nio-8080-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke

匿名 (未验证) 提交于 2019-12-02 21:53:52
使用 ThreadLocal 在项目中 出现报错 具体问题可以查看我提问题的链接 https://bbs.csdn.net/topics/392383155 这里贴上我的解决方法 package com.gem.struts.core; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; public class ActionContext { private ThreadLocal<Map<String, Object>> threadLocal = ThreadLocal.withInitial (() -> new HashMap<>()) ; private static ActionContext context = new ActionContext () ; public static ActionContext getContext () { return context ; } public void setRequest (HttpServletRequest request) { threadLocal . get () . put

java后端处理高并发

匿名 (未验证) 提交于 2019-12-02 21:52:03
/** *@author xiaoxie *@date create 2019/9/17 *@return * 处理高并发 */ public class RequestHolder { // 线程处理 private static final ThreadLocal < SysUser > userHolder = new ThreadLocal < SysUser >(); // 登录 private static final ThreadLocal < HttpServletRequest > requestHolder = new ThreadLocal < HttpServletRequest >(); // 设置登陆用户 public static void add ( SysUser sysUser ){ userHolder . set ( sysUser ); } public static void add ( HttpServletRequest request ) { requestHolder . set ( request ); } // 处理当前用户 public static SysUser getCurrentUser () { return userHolder . get (); } // 处理当前登录 public static