threadlocal

Android进阶之路——Handler机制

烈酒焚心 提交于 2020-01-22 22:09:06
Handler简介 Handler在日常开发中或多或少的都用过,在Android开发中是一个比较重要的知识点,希望通过这篇文章会使你对Handler有更全面的理解。 Hanlder设计的初衷或用途主要有两点: 在不同线程中执行任务。 执行定时任务。 Handler基本使用方式 下面代码展示了Handler使用的基本流程。 // 定义一个消息标识符 final int MESSAGE_WHAT_TEST = 100 ; // 1.创建一个Handler对象。 Handler handler = new Handler ( ) { @Override public void handleMessage ( Message msg ) { // 2. 重写handleMessage方法处理发送过来的Message // 判断Message类型 if ( msg . what == MESSAGE_WHAT_TEST ) { // 接收Message中的数据 String data = ( String ) msg . obj ; // 展示数据 textView . setText ( data ) ; } } } ; // 3. 新建一个Message对象承载要传输的数据。 Message msg = new Message ( ) ; // 4. 给Message设置一个标识符

本地线程-ThreadLocal

大憨熊 提交于 2020-01-22 07:40:18
线程本地存储是一个自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储。简单来说,就是对于某个变量,针对不同的线程存储不同的值。 实例: import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @Description * @Author KToTo * @Date 2019/3/18 22:22 **/ public class ThreadLoaclVariableHolder { //创建一个全局的ThreadLocal对象 private static ThreadLocal<Integer> value = new ThreadLocal<Integer>(){ private Random random = new Random(47); //初始化方法,此处的Random相当于共享变量,为了使演示效果明显, //故将该初始化方法同步 protected synchronized Integer initialValue() { return random.nextInt(1000); } }; /

多线程学习笔记5之ThreadLocal和强 软 弱 虚引用

荒凉一梦 提交于 2020-01-21 21:59:03
ThreadLocal ThreadLocal中有一个Map,为每个线程维护一个副本,保证每个线程中的数据进行隔离,下面我们看一个小程序 public class ThreadLocalDemo { static Person p = new Person(); public static void main(String[] args) { new Thread(() -> { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(p.name); },"t1").start(); new Thread(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } p.name = "Mary"; },"t2").start(); } static class Person { public String name = "Jack"; } } 打印结果是Mary,事实上,我想要的结果还是Jack,不希望在t2线程中对变量的修改影响到p1线程的结果

Spring Bean单例与线程安全

那年仲夏 提交于 2020-01-21 20:28:03
一、Spring单例模式及线程安全   Spring框架中的Bean,或者说组件,获取实例的时候都是默认单例模式,这是在多线程开发的时候需要尤其注意的地方。   单例模式的意思是只有一个实例,例如在Spring容器中某一个类只有一个实例,而且自行实例化后并项整个系统提供这个实例,这个类称为单例类。   当多个用户同时请求一个服务时,容器会给每一个请求分配一个线程,这时多个线程会并发执行该请求对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。 同步机制的比较:   ThreadLocal和线程同步机制相比有什么优势呢?他们都是为了解决多线程中相同变量的访问冲突问题。   在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。   而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时

ThreadLocal可能引起的内存泄露

偶尔善良 提交于 2020-01-21 18:32:11
  threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法.    在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用.      每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收. 但是,我们的value却不能回收,因为存在一条从current thread连接过来的强引用. 只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.   所以得出一个结论就是只要这个线程对象被gc回收,就不会出现内存泄露,但在threadLocal设为null和线程结束这段时间不会被回收的

ThreadLocal原理分析与使用场景

穿精又带淫゛_ 提交于 2020-01-21 13:48:43
什么是ThreadLocal变量 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。 ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。 总的来说,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。 ThreadLocal实现原理 首先 ThreadLocal 是一个泛型类,保证可以接受任何类型的对象。 因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap

Java多线程-ThreadLocal详解

纵饮孤独 提交于 2020-01-21 05:32:32
文章目录 简介 例子 实现原理 常用方法详解 set方法 get方法 remove方法 ThreadLocal的作用 注意事项 总结 简介 ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLocal变量后,每个线程都会复制一个变量到自己的本地内存。 简单说ThreadLocal就是一种以空间换时间的做法,在每个Thread里面维护了一个ThreadLocal.ThreadLocalMap,把数据进行隔离,每个线程的数据不共享,自然就没有线程安全方面的问题了. ThreadLocal可以实现每个线程绑定自己的值,即每个线程有各自独立的副本而互相不受影响。一共有四个方法:get, set, remove, initialValue。可以重写initialValue()方法来为ThreadLocal赋初值 例子 本例开启了两个线程,在每个线程内部都设置了本地变量的值,代码如下: public class ThreadLocalDemo { //创建ThreadLocal变量 static ThreadLocal<String> localParam = new

Java并发编程--并发编程线程基础(一)

巧了我就是萌 提交于 2020-01-20 19:19:23
文章目录 1. 什么是线程 2. 线程创建与运行 3. 线程通知与等待 (1). wait() (2). wait(long timeout) (3). notify() (4). notifyAll() 4. join()方法 5. sleep()方法 6. yield()方法 7. 线程中断 8. 理解线程上下文切换 9. 线程死锁 (1). 什么是线程死锁 (2). 如何避免线程死锁 10. 守护线程与用户线程 11. ThreadLocal (1). ThreadLocal实现原理 (2). ThreadLocalMap类 (3). ThreadLocal内存泄漏问题 (4). ThreadLocal不支持继承性 (5). InheritableThreadLocal类 1. 什么是线程 ​   线程是CPU调度的单位,进程是资源分配的单位 ​  一个进程中有多个线程,多个线程共享进程的 堆 (存放对象实例)和 方法区 (类,常量和静态变量),每个线程有自己的 程序计数器 (记录下一步要执行的指令地址,用于记录当前线程执行的位置)和 栈 区域(储存该项成的局部变量,和方法调用帧栈). 2. 线程创建与运行 ​ 线程的三种创建方式 继承Thread类并重写run方法 (执行start()方法) 实现Runnable接口的Run方法 (将接口对象传入Thread对象

JAVA多线程(十)Java多线程之ThreadLocal

冷暖自知 提交于 2020-01-19 03:53:05
1.JAVA多线程(十)Java多线程之ThreadLocal 1.1 ThreadLocal类    ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。 如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用 get()和 set())方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。 每个线程往ThreadLocal中读写数据是线程隔离,互相之间不会影响的,由于不需要共享信息,自然就不存在竞争问题了,从而保证了某些情况下线程的安全,以及避免了某些情况需要考虑线程安全必须同步带来的性能损失! 1.2 ThreadLocal示例 package com . yuanxw . chapter10 ; import java . util . Random ; /** * ThreadLocal * 线程局部变量 */ public class ThreadLocalExample { private static ThreadLocal < String > defaultThreadLocal = new ThreadLocal ( ) {

Flask框架之ThreadLocal变量

青春壹個敷衍的年華 提交于 2020-01-19 02:27:14
Local对象隔离线程间的对象_即ThreadLocal变量 Local对象 在Flask中,类似于 request 对象,其实是绑定到了一个 werkzeug.local.Local 对象上。 这样,即使是同一个对象,那么在多个线程中都是隔离的。 类似的对象还有 session 以及 g 对象。 flask=werkzeug + sqlalchemy + jinja2 ThreadLocal变量 Python 提供了 ThreadLocal 变量,它本身是一个全局变量,但是每个线程却可以利用它来保存属于自己的私有数据,这些私有数据对其他线程也是不可见的。 总结: 只要满足绑定到 local 或 Local 对象上的属性,在每个线程中都是隔离的,那么他就叫做 ThreadLocal 对象,也叫 ThreadLocal 变量。 python中的线程 from threading import Thread , local local = local ( ) local . request = '具体用户的请求对象' class MyThread ( Thread ) : def run ( self ) : local . request = 'wukong' print ( '子线程:' , local . request ) mythread = MyThread ( )