threadlocal

深入ThreadLocal的内部机制

≯℡__Kan透↙ 提交于 2019-12-01 23:43:46
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本。 ThreadLocal的接口方法: void set(Object value):设置当前线程的线程局部变量的值。 public Object get():该方法返回当前线程所对应的线程局部变量。 public void remove():将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。 需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收, 所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected Object initialValue():返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。 这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行, 并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。 在JDK5.0中

Fork/Join模式(JSR166y)手记之ThreadLocalRandom

无人久伴 提交于 2019-12-01 23:43:32
ThreadLocalRandom是一个可以独立使用的、用于生成随机数的类。继承自Random,但性能超过Random,所谓“青出于蓝而胜于蓝”。其API所提供方法,不多,父类Random具有的,它也一样具有。从表明看,是一个单例模式,其实不然: private static final ThreadLocallocalRandom = new ThreadLocal() { protected ThreadLocalRandom initialValue() { return new ThreadLocalRandom(); } }; ThreadLocalRandom() { super(); initialized = true; } public static ThreadLocalRandom current() { return localRandom.get(); } 采用ThreadLocal进行包装的Random子类,每线程对应一个ThreadLocalRandom实例。测试代码: @Test public void testInstance() { final ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); final ListrandomList = new

深入ThreadLocal的内部机制

守給你的承諾、 提交于 2019-12-01 21:37:32
深入ThreadLocal的内部机制 早在 JDK 1.2 的版本中就提供 java.lang.ThreadLocal , ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal 并不是一个 Thread ,而是 Thread 的局部变量。当使用 ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本。 ThreadLocal 的接口方法: void set(Object value) :设置当前线程的线程局部变量的值。 public Object get() :该方法返回当前线程所对应的线程局部变量。 public void remove() :将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是 JDK 5.0 新增的方法。 需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收, 所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected Object initialValue() :返回该线程局部变量的初始值,该方法是一个 protected 的方法,显然是为了让 子类覆盖 而设计的。 这个方法是一个延迟调用方法,在线程第 1 次调用 get() 或 set(Object)

Java中ThreadLocal的设计与使用

℡╲_俬逩灬. 提交于 2019-12-01 21:37:21
ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧 ThreadLocal的设计 首先看看ThreadLocal的接口:     Object get() ; // 返回当前线程的线程局部变量副本 protected Object initialValue(); // 返回该线程局部变量的当前线程的初始值     void set(Object value); // 设置当前线程的线程局部变量副本的值   

多线程总结(二) ---- ThreadLocal

為{幸葍}努か 提交于 2019-12-01 20:41:54
一、代码示例   可以看出不同线程之间 threadLocal 相互独立,互不干扰。 1 public class ThreadLocalTest { 2 3 public static void main(String[] args) { 4 5 Thread t1 = new Thread(new MyRunnable()); 6 Thread t2 = new Thread(new MyRunnable()); 7 t1.start(); 8 t2.start(); 9 10 } 11 12 public static class MyRunnable implements Runnable { 13 14 private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); 15 16 @Override 17 public void run() { 18 threadLocal.set((int) (Math.random() * 100D)); 19 System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get()); 20 } 21 } 22 23 } 二、源码解读 get()方法 /** * Returns

线程安全好文章

霸气de小男生 提交于 2019-12-01 13:26:36
转:https://www.cnblogs.com/lixinjie/p/10817860.html 不是线程的安全 面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。 论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。 同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。 目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的。 在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。 假设某个线程把数据处理到一半,觉得很累,就去休息了一会,回来准备接着处理,却发现数据已经被修改了,不是自己离开时的样子了。可能被其它线程修改了。 比如把你住的小区看作一个进程,小区里的道路/绿化等就属于公共区域。你拿1万块钱往地上一扔,就回家睡觉去了。睡醒后你打算去把它捡回来,发现钱已经不见了。可能被别人拿走了。 因为公共区域人来人往,你放的东西在没有看管措施时,一定是不安全的。内存中的情况亦然如此。 所以线程安全指的是,在堆内存中的数据由于可以被任何线程访问到,在没有限制的情况下存在被意外修改的风险。

ThreadLocal(线程本地存储)

房东的猫 提交于 2019-12-01 13:11:26
1. T hreadLocal ,即线程本地变量或线程本地存储。   threadlocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。 1.1 ThreadLocalMap(就是线程中的一个属性)   每个线程中都有一个自己的threadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。   将一个共用的threadlocal静态实例作为key,将不同对象的引用保存到不同线程的threadLocalMap中,然后在线程执行的各处通过这个静态threadlocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。   threadLocalMap其实就是线程里面的一个属性,他在thread类中定义。     ThreadLocal.ThreadLocalMap threadLocals=null; 使用场景:   最常见的threadlocal使用场景是用来解决数据库连接、session管理等。 1 private static final ThreadLocal threadSession = new ThreadLocal(); 2 public static Session getSession() throws

java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用?

久未见 提交于 2019-12-01 12:33:08
java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用? 说明类java.lang.ThreadLocal的作用和原理。列举在哪些程序中见过ThreadLocal的使用? 类java.lang.ThreadLocal的作用 要编写一个多线程安全(Thread-safe)的程序是困难的,为了让线程共享资源,必须小心地对共享资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同步的时候,又要注意对象的锁定与释放,避免产生死结,种种因素都使得编写多线程程序变得困难。 尝试从另一个角度来思考多线程共享资源的问题,既然共享资源这么困难,那么就干脆不要共享,何不为每个线程创造一个资源的复本。将每一个线程存取数据的行为加以隔离,实现的方法就是给予每个线程一个特定空间来保管该线程所独享的资源。 比如:在Hibernate中的Session就有使用。 ThreadLocal的原理 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 来源: https://www.cnblogs.com/Yanss/p/11685839.html

Java读源码之ThreadLocal

本小妞迷上赌 提交于 2019-12-01 10:26:10
前言 JDK版本: 1.8 之前在看Thread源码时候看到这么一个属性 ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocal实现的是每个线程都有一个本地的副本,相当于局部变量,其实ThreadLocal就是内部自己实现了一个map数据结构。 ThreadLocal确实很重要,但想到看源码还是有个小故事的,之前去美团点评面试,问我如何保存用户登录token,可以避免层层传递token? 心想这好像是在说ThreadLocal,然后开始胡说放在redis里或者搞个ThreadLocal,给自己挖坑了 面试官继续问,ThreadLocal使用时候主要存在什么问题么? 完蛋,确实只了解过,没怎么用过,凉凉,回来查了下主要存在的问题如下 ThreadLocal可能内存泄露? 带着疑惑进入源码吧 源码 类声明和重要属性 package java.lang; public class ThreadLocal<T> { // hash值,类似于Hashmap,用于计算放在map内部数组的哪个index上 private final int threadLocalHashCode = nextHashCode(); private static int nextHashCode() { return nextHashCode

反驳:Threadlocal存在内存泄露

筅森魡賤 提交于 2019-12-01 10:04:14
最近看到网上的一篇文章,分析说明ThreadLocal是如何内存泄露的. 但我不这么认为. ThreadLocal设计的很好,根本不存在内存泄露问题. 本文就结合图和代码的例子来验证我的看法. 网上的代码例子普遍是这样子的: public class Test { public static void main(String[] args) throws InterruptedException { ThreadLocal tl = new MyThreadLocal(); tl.set(new My50MB()); tl=null; System.out.println("Full GC"); System.gc(); } public static class MyThreadLocal extends ThreadLocal { private byte[] a = new byte[1024*1024*1]; @Override public void finalize() { System.out.println("My threadlocal 1 MB finalized."); } public static class My50MB { private byte[] a = new byte[1024*1024*50]; @Override public void