threadlocal

ThreadLocal学习(一)

丶灬走出姿态 提交于 2020-02-02 03:24:21
Java:ThreadLocal有什么用呢? ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。ThreadLocal可以用来解决多线程程序的并发问题,ThreadLocal并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。 ThreadLocal的应用场景? 在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。这种情况下可以将 类变量 放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。最常见的ThreadLocal使用场景为用来解决数据库连接、Session管理等。在下面会例举几个场景。 ThreadLocal类中的方法:(JDK5版本之后支持泛型)

线程间通信知识点补充

帅比萌擦擦* 提交于 2020-02-01 23:16:58
我们通过之前几章的学习已经知道在线程间通信用到的synchronized关键字、volatile关键字以及等待/通知(wait/notify)机制。今天我们就来讲一下线程间通信的其他知识点:Thread.join()的使用、ThreadLocal的使用。 一 Thread.join()的使用 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是 主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。另外,一个线程需要等待另一个线程也需要用到join()方法。 Thread类除了提供join()方法之外,还提供了join(long millis)、join(long millis, int nanos)两个具有超时特性的方法。 这两个超时方法表示,如果线程thread在指定的超时时间没有终止,那么将会从该超时方法中返回。 1.1 join方法使用 不使用join方法的弊端演示: public class Test1 { public static void main ( String [ ] args ) throws InterruptedException { MyThread threadTest = new MyThread ( ) ;

ThreadLocal实现线程单例

断了今生、忘了曾经 提交于 2020-01-31 21:18:39
提示:其实是伪线程安全的。 使用场景:ORM框架中实现多数据源动态切换。 public class ThreadLocalSingleton { private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance = new ThreadLocal<ThreadLocalSingleton>(){ @Override protected ThreadLocalSingleton initialValue() { return new ThreadLocalSingleton(); } }; private ThreadLocalSingleton(){} public static ThreadLocalSingleton getInstance(){ return threadLocalInstance.get(); } } public static void main(String[] args) { System.out.println(ThreadLocalSingleton.getInstance()); System.out.println(ThreadLocalSingleton.getInstance()); System.out.println

简析ThreadLocal

二次信任 提交于 2020-01-30 00:05:48
ThreadLocal是什么 我们知道在使用多线程时,有时需要共享变量,需要同步数据,所以各个线程之间对这个变量都是开放的,这概念可以称之为线程开放。但也不是所有时候都需要同步数据,每个线程也可以有自己独有的变量,不需要同步给其他线程,这概念可以叫做线程封闭。而ThreadLocal就是线程封闭具体的体现之一。在JDK1.2版本里就提供了java.lang.ThreadLocal类,我们可以把ThreadLocal理解为线程的局部变量,是一个线程级别的变量。 ThreadLocal的简单实践 demo代码如下: public class TestMain { public static void main ( String [ ] args ) throws Exception { ThreadLocal < String > value = new ThreadLocal < > ( ) ; value . set ( "主线程" ) ; String threadLocal = value . get ( ) ; System . out . println ( "执行线程一前主线程threadLocal值为:" + threadLocal ) ; Thread thread = new Thread ( new Runnable ( ) { @Override public

Java多线程同步之ThreadLocal与Synchromized

半世苍凉 提交于 2020-01-29 23:05:28
前言: ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,只是二者处理问题的思路和角度不同。 ThreadLocal是Java类,是通过每个线程单独一份存储空间,牺牲空间来弥补时间来解决多线程访问冲突,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。 Synchronized是Java保留关键字,通过线程等待,牺牲时间来解决访问冲突。依靠JVM的锁机制来实现临界区的函数或者变量的访问中的原子性。在同步机制中,通过对象的锁机制保证同一时间只有一个线程的访问变量,此时被用作锁机制的变量被多个线程共享。 代码 Synchronized public class SqlConnectionUtil { private static SqlPool instance=null; public static synchronized SqlConnection getInstance(){ if(instance==null) instance=new SqlPool(); return instance.getSqlConnection(); } ThreadLocal public class SqlConnectionUtil { private static ThreadLocal

ThreadLocal如何解决内存泄漏

老子叫甜甜 提交于 2020-01-28 03:08:12
ThreadLocal我主要从以下接个方面说明: 基础 理解 接口方法 源码分析 ThreadLocal如何解决内存泄漏 1、基础 ThreadLocal从字面意思为:线程本地。它是一个关于创建线程局部变量的类。 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。 有一个误区是ThreadLocal的目的是为了解决多线程访问资源时的共享问题 但ThreadLocal 并不解决多线程 共享 变量的问题。既然变量不共享,那就更谈不上同步的问题。 2、理解 ThreadLoal 变量,它的基本原理是,同一个 ThreadLocal 所包含的对象(对ThreadLocal< String >而言即为 String 类型变量),在不同的 Thread 中有不同的副本(实际是不同的实例)。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题 既无共享,何来同步问题,又何来解决同步问题一说? 那 ThreadLocal 到底解决了什么问题,又适用于什么样的场景? ThreadLocal

线程的补充

余生颓废 提交于 2020-01-26 15:15:22
1. ThreadLocal ThreadLocal让线程有自己的局部变量,其中重要的方法有:set(),get(),remove() ThreadLocal的使用 public static void main(String[] args) { ThreadLocal<String> local = new ThreadLocal(); Thread thread1 = new Thread( () -> { local.set("我是线程1的消息"); System.out.println("线程1的输出:" + local.get()); }); Thread thread2 = new Thread( () -> { System.out.println("线程2的输出:" + local.get()); }) ; thread1.start(); thread2.start(); } 线程1的输出:我是线程1的消息 线程2的输出:null 线程1存的内容,只有线程1能使用,其他线程拿不到 2. 原理 来看看set方法 public void set(T value) { Thread t = Thread.currentThread(); //获取当前线程 ThreadLocalMap map = getMap(t); //获取ThreadLocalMap,下面会说明

Spring框架学习笔记-ThreadLocal基础知识

守給你的承諾、 提交于 2020-01-26 07:33:25
在前面我们已经说过,Spring通过各种模板降低了开发者使用各种数据持久化技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。 我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线性安全的,也就是说它们不能在同一时刻被多个线程共享,虽然模板类通过资源池获取数据连接或对话,但资源池本身解决的是数据连接或对话的缓存问题,并非数据连接或对话的线程安全问题。 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用线程同步。但模板类并未采用线程同步机制,因为线程同步会降低并发性,影响系统性能。 那么模板类是靠的什么,可以在无需线程同步的情况下就化解了线程安全的难题呢?答案就是ThreadLocal! ThreadLocal在Spring里发挥着重要的作用,在管理request作用域的Bean、事务管理以及任务调度、AOP等模块都出现了它们的身影,起着举足轻重的作用。要想了解Spring事务管理的底层技术,ThreadLocal是必须攻克的山头堡垒。 1.ThreadLocal是什么 ThreadLocal是服务于Thread的一种 本地私有数据机制 ,threadlocalvariable(线程局部变量), 即为每一个使用该变量的线程都提供一个变量值的副本

Java之ThreadLocal原理分析

独自空忆成欢 提交于 2020-01-25 16:58:24
简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。引自@ 枫之逆 人们常说,锁是一种以时间换空间的机制,而ThreadLocal正好是以空间换时间的。 和锁的比较 为什么要先强调这一点,因为从简介上看,容易使人们联想到ThreadLocal似乎是一种解决Java多线程环境中线程同步与线程安全方法,其实不然,这里要设计到两个概念:线程安全,线程同步,事实上,ThreadLocal只解决线程安全的问题,并不能解决线程同步的问题,这也造成在刚学习的时候,我总是在苦想,ThreadLocal既然为每个线程拷贝一份变量,那怎么再进行同步呢?查了很多资料后才想明白,ThreadLocal并不是用来解决线程同步的,所以它与锁可以说是没有什么关系的,彼此各有所长,不能代替

ThreadLocal源码解析

橙三吉。 提交于 2020-01-23 14:29:04
JDK源码如是说: ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时 能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是 private static 类型的, 用于关联线程和线程的上下文。 1、内部存储元素采用ThreadLocalMap,其内部   1.1、Entry继承WeakReference<ThreadLocal<?>>,     方便垃圾回收key。每次get()——>getEntry()——>getEntryAfterMiss——>expungeStaleEntry删除key为null的值。   1.2、使用ThreadLocal作为key,减少Entry的key数量,提高性能。 2、使用时,继承 protected T initialValue() { return null; } 添加需要返回的对象。 建议将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。 ps