`
newleague
  • 浏览: 1501296 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

对ThreadLocal的几种误解

阅读更多

最近由于需要用到ThreadLocal,在网上搜索了一些相关资料,发现对ThreadLocal经常会有下面几种误解

 一、ThreadLocal是java线程的一个实现
      ThreadLocal的确是和java线程有关,不过它并不是java线程的一个实现,它只是用来维护本地变量。针对每个线程,提供自己的变量版本,主要是为了避免线程冲突,每个线程维护自己的版本。彼此独立,修改不会影响到对方。

 二、ThreadLocal是相对于每个session的
        ThreadLocal顾名思义,是针对线程。在java web编程上,每个用户从开始到会话结束,都有自己的一个session标识。但是ThreadLocal并不是在会话层上。其实,Threadlocal是独立于用户session的。它是一种服务器端行为,当服务器每生成一个新的线程时,就会维护自己的ThreadLocal。对于这个误解,个人认为应该是开发人员在本地基于一些应用服务器测试的结果。众所周知,一般的应用服务器都会维护一套线程池,也就是说,对于每次访问,并不一定就新生成一个线程。而是自己有一个线程缓存池。对于访问,先从缓存池里面找到已有的线程,如果已经用光,才去新生成新的线程。所以,由于开发人员自己在测试时,一般只有他自己在测,这样服务器的负担很小,这样导致每次访问可能是共用同样一个线程,导致会有这样的误解:每个session有一个ThreadLocal
 三、ThreadLocal是相对于每个线程的,用户每次访问会有新的ThreadLocal
  理论上来说,ThreadLocal是的确是相对于每个线程,每个线程会有自己的ThreadLocal。但是上面已经讲到,一般的应用服务器都会维护一套线程池。因此,不同用户访问,可能会接受到同样的线程。因此,在做基于TheadLocal时,需要谨慎,避免出现ThreadLocal变量的缓存,导致其他线程访问到本线程变量
 四、对每个用户访问,ThreadLocal可以多用
        可以说,ThreadLocal是一把双刃剑,用得来的话可以起到非常好的效果。但是,ThreadLocal如果用得不好,就会跟全局变量一样。代码不能重用,不能独立测试。因为,一些本来可以重用的类,现在依赖于ThreadLocal变量。如果在其他没有ThreadLocal场合,这些类就变得不可用了。个人觉得ThreadLocal用得很好的几个应用场合,值得参考
  1、存放当前session用户:quake want的jert
  2、存放一些context变量,比如webwork的ActionContext
  3、存放session,比如Spring hibernate orm的session
分享到:
评论

相关推荐

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    ThreadLocal

    它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能出现的并发问题,避免了使用synchronized关键字进行同步控制的复杂性。 在Java...

    理解ThreadLocal

    理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal

    java 简单的ThreadLocal示例

    - 当你对ThreadLocal进行`set()`操作时,实际上是将值放入了当前线程的ThreadLocalMap中,键是ThreadLocal对象本身,值是你设置的对象。 - 当你调用`get()`时,它会查找当前线程的ThreadLocalMap,找到对应的键(即...

    ThreadLocal 内存泄露的实例分析1

    因此,只要线程还在,`ThreadLocal` 中的 `MyCounter` 对象就不会被垃圾收集,也就意味着对 `WebappClassLoader` 的间接引用仍然存在,导致 `WebappClassLoader` 无法被回收。 类的生命周期与类加载器紧密关联。...

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

    正确理解ThreadLocal.pdf

    `ThreadLocal`是一种强大的工具,它简化了多线程编程中对线程局部数据的管理,提高了代码的可读性和可维护性。然而,不当的使用也可能导致内存泄漏和其他潜在问题。因此,在使用`ThreadLocal`时,应当充分理解其工作...

    ThreadLocal整理.docx

    ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...

    threadLocal

    2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. ...

    设计模式及ThreadLocal资料

    代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,代理模式常用于动态代理,允许在运行时为对象绑定额外的行为,如AOP(面向切面编程)中的事务管理。 然后,我们转向ThreadLocal。ThreadLocal是...

    ThreadLocal原理及在多层架构中的应用

    ThreadLocal的工作原理主要基于以下几点: - **内部类ThreadLocalMap**:ThreadLocal在每个线程内部维护了一个名为ThreadLocalMap的哈希映射表,这个表的键是ThreadLocal对象,值是线程局部变量的实际值。这样,每...

    java中ThreadLocal详解

    而`ThreadLocal`则提供了另一种思路:为每个使用该变量的线程分配独立的副本,这样一来,每个线程拥有自己的变量副本,互不影响,从而避免了线程安全问题。 #### 二、ThreadLocal的数据结构及实现原理 `...

    使用ThreadLocal管理“session”数据

    在实际开发中,有些框架如Spring已经内置了对ThreadLocal的管理和清理机制,可以更方便地在多线程环境中使用session。 总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web...

    ThreadLocal详解.md

    学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!

    ThreadLocal简单Demo

    3. **键值对**: 在`ThreadLocalMap`中,键是`ThreadLocal`对象的弱引用,而值是用户设置的对象。弱引用意味着,如果键不再被其他地方引用,即使值还在,垃圾收集器也会回收键,从而自动清理`ThreadLocalMap`中不再...

    java中ThreadLocal类的使用

    `ThreadLocal`类的主要方法有以下几个: 1. `void set(T value)`:设置当前线程的线程局部变量的值。 2. `T get()`:返回当前线程的线程局部变量的值。 3. `void remove()`:移除当前线程的线程局部变量。 4. `T ...

Global site tag (gtag.js) - Google Analytics