ThreadLocal原理

什么是ThreadLocal

该类提供了线程局部变量,就是为每一个使用它的线程提供一个变量的副本,使每一个

线程可以独立的改变自己的副本,而不会和其它线程发生冲突。说白了就是解决对线程访问共享

资源时发生冲突的问题,也算是一种同步的方式。

ThreadLocal的实现原理

public class ThreadLocal  
{  
  private Map values = Collections.synchronizedMap(new HashMap());  
  public Object get()  
  {  
      Thread curThread = Thread.currentThread();  
      Object o = values.get(curThread);  
      if (o == null && !values.containsKey(curThread))  
      {  
          o = initialValue();  
          values.put(curThread, o);  
      }  
      return o;  
  }  
  public void set(Object newValue)  
  {  
      values.put(Thread.currentThread(), newValue);  
    }  
    public Object initialValue()  
    {  
      return null;  
  }  
}

思路就是他的底层维护了一个线程安全的Map,Map就以键值对的形式存储线程对象和线程对象的副本值。

ThreadLocal的常用api


其中initialValue()方法用于返回此线程局部变量的当前线程的初始值,该方法是一个延迟调用的方法,只有当线程第一次调用get或者set

方法时,他才会执行,并且只执行这一次。还有他是一个protected修饰的方法,可以方便子类重写该方法,可以根据需求进行自定义的初始化。

ThreadLocal与其他同步机制的区别

ThreadLocal与普通的同步机制都是为了解决多线程访问共享资源时会产生冲突的问题,普通的同步机制是控制了线程对共享资源的

访问时间而避免冲突的,他是多个线程进行通信的有效方式,而ThreadLocal则是在空间上对共享数据进行了隔离,从根本上来说,数据已经

不在共享了以此避免冲突。因此两种方式是在不同的角度所实现的线程安全。

当我们需要多线程之间进行通信就使用同步机制,需要隔离多个线程之间的共相冲突,就是用ThreadLocal。

原文地址:http://blog.51cto.com/12222886/2070385

时间: 2024-10-29 19:06:09

ThreadLocal原理的相关文章

java多线程模式ThreadLocal原理简述及其使用详解

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解 代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm ThreadLocal是为了使每个线程保存一份属于自己的数据. 先看一个使用ThreadLocal的实例. package com.zuidaima.aop.framework; import com.zuidaima.core.NamedThreadLocal; public abstra

ThreadLocal原理及内存泄漏

ThreadLocal原理及内存泄漏 ThreadLocal有两个问题: 1. 每个变量副本是存储在哪了? 2. 变量副本是怎样从共享的变量中赋值出来的?源码中threadlocal的初始值是什么时候设置的. ThreadLocal为每个线程维护一个变量的副本? 每个线程的ThreadLocalMap都是线程自身持有的,但是初始化是在ThreadLocal中,然后每个线程相当于保存了一个map 这个map存的key是Thread的实例,value是存储的线程的局部变量 get方法 根据当前线程获

ThreadLocal原理及使用示例

简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ThreadLocal<T> 简介和使用示例 ThreadLocal只有一个无参的构造方法 public ThreadLocal() ThreadLocal的相关方法 public T get() public void set(T value) public v

ThreadLocal原理分析与代码验证

ThreadLocal提供了线程安全的数据存储和访问方式,利用不带key的get和set方法,居然能做到线程之间隔离,非常神奇. 比如 ThreadLocal<String> threadLocal = new ThreadLocal<>(); in thread 1 //in thread1 treadLocal.set("value1"); ..... //value的值是value1 String value = threadLocal.get(); in

Java之ThreadLocal原理分析

简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思.所以,在Java中编写线程局部变量

ThreadLocal原理与模拟

首先用一个程序模拟一下ThreadLocal: public class ThreadLocal1 { private static Dictionary<Thread, Integer> map; public static void main(String[] args) { map = new Hashtable<Thread, Integer>(); for (int i = 0; i < 2; i++) { new Thread(new Runnable() { p

ThreadLocal原理详解

ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本. 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中"Local"所要表达的意

threadlocal原理分析

简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.从线程的角度看,目标变量就象是线程的本地变量,这也是类名中"Local"所要表达的意思.所以,在Java中编写线

简单理解ThreadLocal原理和适用场景

https://blog.csdn.net/qq_36632687/article/details/79551828?utm_source=blogkpcl2 参考文章: 正确理解ThreadLocal 一个故事讲明白 ThreadLocal 原文地址:https://www.cnblogs.com/zt007/p/9797762.html