`
yangtsefisher
  • 浏览: 27128 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ThreadLocal和Map<Thread, Object>比较

    博客分类:
  • Java
阅读更多

ThreadLocal, 是JDK的,想法有点 "线程作用域"之类的变量

 

相对于全局Map<Thread, Object>的 实现来说, ThreadLocal有一些优点,

它把线程自己用的对象放在了Thread对象的threadLocals里面,而不是放在全局的map里面,在调用exit()方法的时候,会把threadLocals释放。
这样就算只set()而没有remove()也没有关系,但全局map就必须得记得要remove().

ThreadLocal只是作为引用key变量,指向值,提供工具方法,不存任何东西,感觉这种实现方式优雅很多,Map<Thread, Object>可以用ThreadLocal替代。

昨天看到在Java Concurrency in Practice 中Section 3.3.3. ThreadLocal一节对此也有很好的解释。

分享到:
评论

相关推荐

    ThreadLocal_ThreadLocal源码分析_

    &gt;&gt;`和`Object`的组合,提高了内存管理效率。 **JDK 8之前的ThreadLocalMap** 在JDK 8之前,ThreadLocalMap的实现是一个静态内部类,它不是HashMap,而是基于Entry数组实现的。Entry继承自WeakReference...

    理解threadlocal

    private Map&lt;Thread, T&gt; valueMap = new HashMap&lt;&gt;(); public void set(T newValue) { valueMap.put(Thread.currentThread(), newValue); } public T get() { Thread currentThread = Thread.currentThread...

    ThreadLocal源码分析和使用

    private static ThreadLocal&lt;Integer&gt; seNum=new ThreadLocal&lt;Integer&gt;(){ protected Integer initialValue(){ return 0; } } public Integer getNextNum(){ seNum.set(seNum.get()+1); return seNum.get();...

    基于注解多数据源解决方案.docx

    private static final ThreadLocal&lt;String&gt; THREAD_DATA_SOURCE = new ThreadLocal&lt;&gt;(); public static String getDataSource() { return THREAD_DATA_SOURCE.get(); } public static void setDataSource...

    基于注解的Spring多数据源配置和使用

    private static final ThreadLocal&lt;String&gt; THREAD_DATA_SOURCE = new ThreadLocal&lt;&gt;(); public static String getDataSource() { return THREAD_DATA_SOURCE.get(); } public static void setDataSource...

    理解ThreadLocal

    ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量,它为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal 的接口方法...

    如何在Spring中自定义scope的方法示例

    private final ThreadLocal&lt;Map&lt;String, Object&gt;&gt; threadBoundBeans = new ThreadLocal&lt;&gt;(); @Override public Object get(String name, ObjectFactory&lt;?&gt; objectFactory) { Map&lt;String, Object&gt; ...

    JAVA面试八股文JAVA面试八股文

    - **集合框架**:理解List、Set、Map接口以及其实现类的特性和应用场景,例如ArrayList和LinkedList的区别,HashMap和ConcurrentHashMap的区别等。 - **异常处理**:理解Checked异常和Unchecked异常的区别,掌握...

    JAVA API1.6中文文档.CHM

    4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了线程相关类和接口,用于实现并发编程,如`Runnable`、`ThreadLocal`、`ExecutorService`。 5. **网络编程**:`java.net`包包含网络通信所需的...

    java 1.6 API 中文版

    Java 1.6的集合框架是数据存储和操作的核心部分,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)接口及其实现。这些接口和类提供了丰富的功能,如添加、删除、查找...

    Java线程总结

    在Java中,线程是通过`Thread`类或实现`Runnable`接口来创建和管理的。本文将深入探讨Java线程的相关知识点。 1. **线程的创建** - **继承Thread类**:创建一个新的类,继承自`java.lang.Thread`,重写`run()`方法...

    15道面试常问的Java多线程面试题!.zip

    - 等待(Waiting):线程处于无限期等待状态,如Object.wait()或Thread.join()。 - 定时等待(Timed Waiting):线程处于有限期等待状态,如Thread.sleep()。 - 结束(Terminated):run()方法执行完毕或线程被...

    java函数速查中文版.rar_java docs

    4. **多线程**:Java通过Thread类和Runnable接口支持多线程编程,提供了synchronized关键字、wait()、notify()和notifyAll()等同步控制方法,以及ThreadLocal、ExecutorService等高级并发工具。 5. **网络编程**:...

    java面试突击资料

    - **泛型类和泛型方法**:使用&lt;T&gt;定义泛型类型。 - **类型通配符**:? 表示任意类型,? extends T 和 ? super T 分别表示上限和下限。 **3.2 注解** - **注解类型**:元注解、内置注解、自定义注解。 - **注解...

    java面试宝典2019

    集合是Java编程中常用的数据结构,包括List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)和Map(如HashMap、Hashtable)。它们各自有特定的应用场景和操作方法,例如ArrayList适合快速随机访问,而...

    java经典面试题

    - `List&lt;String&gt;` 不能转换为 `List&lt;Object&gt;`,因为类型参数是不可协变的。 33. **解析 XML 的几种方式**: - DOM:将整个文档加载到内存中。 - SAX:事件驱动模型,逐个解析文档。 - PULL:简化版的 SAX,便于...

    线程相关知识

    12. **线程局部变量(ThreadLocal)**:每个线程都拥有自己的`ThreadLocal`副本,用于存储线程私有的数据,避免了多线程共享数据导致的冲突问题。 13. **Future和Callable**:`Callable`接口类似于`Runnable`,但其...

    一线互联网大厂完整Java面试题.pdf

    1. 关于Java中为什么等待和通知是Object类的成员方法而不是Thread类的成员方法。因为在Java中,任何对象都可以作为一个监视器,wait和notify机制需要依托于对象锁,所以定义在Object类中可以实现该机制。 2. wait...

    Java API原生文档

    3. **多线程**:Java API支持多线程编程,`java.lang.Thread`类和`java.util.concurrent`包提供了丰富的线程控制和同步机制,如`synchronized`关键字、`ThreadLocal`、`ExecutorService`等。 4. **网络编程**:`...

    Java并发编程面试题合集

    在Java中,守护线程(Daemon Thread)和本地线程(也称为用户线程)是有区别的。守护线程是为其他线程提供服务支持的线程,比如垃圾回收线程。当所有非守护线程退出时,JVM会强制终止所有守护线程。相对地,本地线程...

Global site tag (gtag.js) - Google Analytics