threadlocal

Java线程本地存储ThreadLocal

匿名 (未验证) 提交于 2019-12-02 21:52:03
前言 无同步 Thread-Specific Storage 没有共享资源 ThreadLocal ThreadLocal 思维导图 线程安全 示意图 1. 用法 ThreadLocal ThreadLocal android.os.Looper.java ThreadLocal ThradlLocal UML类图 // /frameworks/base/core/java/android/os/Looper.java public class Looper { // ... // sThreadLocal.get() will return null unless you've called prepare(). static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } // 设置线程局部变量的值 sThreadLocal.set(new Looper(quitAllowed

Java中的ThreadLocal详解

匿名 (未验证) 提交于 2019-12-02 21:40:30
一、ThreadLocal简介   多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。   ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,如下图所示 二、ThreadLocal简单使用   下面的例子中,开启两个线程,在每个线程内部设置了本地变量的值,然后调用print方法打印当前本地变量的值。如果在打印之后调用本地变量的remove方法会删除本地内存中的变量,代码如下所示 1 package test; 2 3 public class ThreadLocalTest { 4 5 static ThreadLocal<String> localVar = new ThreadLocal<>(); 6 7 static void print(String str) { 8

python中Threadlocal变量

落花浮王杯 提交于 2019-12-02 19:26:30
在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。 不加锁就会出现变量会被修改的问题,进而会改变进程的内容, 但是局部变量也有很大的局限性,传输非常的繁琐。进而使得代码很不简洁。 如下 def process_student(name): std = Student(name) # std是局部变量,但是每个函数都要用它,因此必须传进去: do_task_1(std) do_task_2(std) def do_task_1(std): do_subtask_1(std) do_subtask_2(std) def do_task_2(std): do_subtask_2(std) do_subtask_2(std) 来源: https://www.cnblogs.com/tanshengjiang/p/11760586.html

ThreadLocal有啥坑

北慕城南 提交于 2019-12-02 19:11:57
public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { threadLocal.set("main"); Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.printf("threadlocal1 value:%s\n", threadLocal.get()); threadLocal.set("thread1"); System.out.printf("threadlocal1 value:%s\n", threadLocal.get()); } }); t1.setName("thread1"); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.printf("threadlocal2 value:%s\n", threadLocal.get()); threadLocal.set("thread2"); System.out.printf("threadlocal2

ThreadLocal简介与原理

断了今生、忘了曾经 提交于 2019-12-02 12:27:32
一、引入场景 1. 打印方法执行的耗时 public void service(){ before(); doSomething(); after(); } 2. 在before和after记录当前时间,两者相减得到doSomething()的耗时 private long startTime; // 定义变量开始时间 public void before(){ startTime=System.CurrentTimeMills(); // 记录开始时间 } public void doSomething(); public void after(){ endTime=System.CurrentTimeMills(); // 记录结束时间 costTime=endTime-startTime; // 计算耗时 } 3. 多线程下,共享变量开始时间startTime可能会被别的线程改写,不是线程安全的 4. 多线程解决方法: a. 加锁,性能不好 b. ThreadLocal 二、概念 1. ThreadLocal线程本地变量,即把共享变量拷贝一份放在当前线程内,变成线程私有的变量 2. 变量的生命周期在当前线程范围内,别的线程不能访问,线程间数据隔离 3. 场景:当一个变量需要与线程关联,并且线程后面还会用到该值,比如traceId 三、ThreadLocal原理 1.

网络编程面试题整理(四)

故事扮演 提交于 2019-12-02 10:44:27
1:重传机制 TCP每发送一个报文段,就设置一次定时器。只要定时器设置的重发时间到而还没有收到确认,就要重发这一报文段。 TCP环境报文往返时间不定、有很大差别。 A、B在一个局域网络,往返时延很小 A、C在一个互联网内,往返时延很大 因此,A很难确定一个固定的、与B、C通信都适用的定时器时间。 TCP采用了一种自适应算法。这种算法记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报文段的往返时延。将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延T。 2:ThreadLocal与其它同步机制的比较 首选了解什么是ThreadLocal:用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。 Threadlocal和其他所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对对象 加锁 来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致的分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的索等等。所有这些都是因为多个线程共享了该资源造成的。Threadlocal就从另一个角度来解决多线程的并发访问

转:理解ThreadLocal

杀马特。学长 韩版系。学妹 提交于 2019-12-02 08:38:23
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。 线程局部变量并不是Java的新发明,很多语言(如IBM IBM XL FORTRAN)在语法层面就提供线程局部变量。在Java中没有提供在语言级支持,而是变相地通过ThreadLocal的类提供支持。 所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)

Spring 中的bean 是线程安全的吗?

本秂侑毒 提交于 2019-12-02 03:48:43
结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。 Spring 的 bean 作用域(scope)类型   1、singleton:单例,默认作用域。   2、prototype:原型,每次创建一个新对象。   3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。   4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。   5、global-session:全局会话,所有会话共享一个实例。 线程安全这个问题,要从单例与原型Bean分别进行说明。 原型Bean   对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。 单例Bean   对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。   如果单例Bean,是一个 无状态Bean ,也就是线程中的操作不会对Bean的成员执行 查询 以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

Java中的ThreadLocal

江枫思渺然 提交于 2019-12-02 01:50:06
关于 ThreadLocal,我们经常用它来解决多线程并发问题,那它究竟是如何做到的?今天就让我们来好好看一下。 从源码入手 首先,让我们看看 ThreadLocal 类中的介绍: This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal

线程封闭之栈封闭和ThreadLocal

[亡魂溺海] 提交于 2019-12-02 00:28:40
线程封闭   在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式。  1、栈封闭   所谓的栈封闭其实就是使用局部变量存放资源,我们知道局部变量在内存中是存放在虚拟机栈中,而栈又是每个线程私有独立的,所以这样可以保证线程的安全。  2、ThreadLocal   我们先看ThreadLocal和线程Thread的关系图。      再看下ThreadLocal的操作,以get为例 public T get() { // 当前线程 Thread t = Thread.currentThread();    // 拿到当前线程的threadLocalMap,即上图中的map引用 ThreadLocalMap map = getMap(t); if (map != null) { // 拿到当前ThreadLocal为Key对应的Entry,里面做了防止内存泄漏的处理 ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } // 如果为null设置默认值 return