`

ThreadLocal简介与使用

    博客分类:
  • jdk
阅读更多

ThreadLocal并不能从字面上理解为线程的本地实现版本,因为它并不是一个线程,而是ThreadLocal Variable(线程局部变量)。它的功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使得每一个线程都可以独立地改变自己的副本,而不会和其他线程珠副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。
首先看看ThreadLocal的方法:
1、get()
  返回当前线程的线程局部变量的副本,当第一次调用这个方法时会自动创建并且初始化一个线程局部变量的副本。
2、initialValue()
  返回该线程的线程局部变量的当前线程的初始值,这个方法只在第一次调用get()方法的时候被调用一次。如果在调用get()方法之前已经调用了set()方法,那么这个方法将不会被调用。
这个方法是一个protected的方法,不能直接调用该方法,只有在其子类中将该方法重写才能改变它的行为。在默认情况下,该方法的返回值为null。
3、set()
  设置当前线程的线程局部变量副本的值。大多数的应用程序都不需要调用这个方法,可以通过initialValue()方法来设置当前线程局部变量的值。
4、remove()
  移除当前线程局部变量的值。这样做的目的是可以降低当前线程的存储空间的使用量,这是Java1.5的新增方法。

ThreadLocal的使用
ThreadLocal的使用方法有两种,一种方法是自己实现ThreadLocal的子类,并重写initialValue()方法。另一种方法是定义一个表态的ThreadLocal实例,通过使用set()方法来初始化这个线程局部变量的值。
  如果希望线程局部变量初始化的时候就具有值,那么需要自己实现ThreadLocal的子类并重写该方法,通常使用一个内部匿名类对ThreadLocal进行子类化。例如在下面的例子中,SerialNum类为每一个类分配一个序号:

 程序代码
public class SerialNum
{
 private static int nextSerialNum=0;
 private static ThreadLocal serialNum=new ThreadLocal()
 {
  protected synchronized Object initialValue()
  {
   return new Integer(nextSerialNum++);
  }
 };
 public static int get()
 {
  return ((Integer)(serialNum.get())).intValue();
 }
}


同样,也可以不采用实现ThreadLocal子类的方法来实现同样的功能,如下所示:

 程序代码
public class SerialNum1
{
 private static int nextSerialNum=0;
 private static ThreadLocal serialNum=new ThreadLocal();
 public static int get()
 {
  if(serialNum.get()==null)
   serialNum.set(new Integer(nextSerialNum++));
  return ((Integer)(serialNum.get())).intValue();
 }

}


  SerialNum类的使用非常简单,因为get()方法是static的,所以在需要获取当前线程的序号时,简单地调用int serial=SerialNum.get();即可。
  在线程是活动并且ThreadLocal对象是可访问时,该线程就持有一个到该线程局部变量副本的隐含引用。当该线程运行结束后,该线程拥有的所有线程局部变量的副本都将失效,并等待垃圾收集器收集。

  ThreadLocal 几点作用:
1)可以启到类似单态类的作用,实际上是要使某变量达到线程安全时,可以使用这种方式;
2)可以结合HttpServletRequest,HttpServletResponse,ServletContext等来实现使用运行时数据;

在使用ThreadLocal 时一般是使用get()方法,但在使用这个方法时,会先调用set()方法,具体的用途可以在创建ThreadLocal 变量时指定,也可以

重写set()方法,如果不想设定set()方法,可以在创建ThreadLocal 变量时指
定,如下:

private static ThreadLocal currentUser = new ThreadLocal(){
         
protected synchronized Object initialValue() {
                 
return new User();
         }

     }
;

或者使用:public static void setCurrentUser(User user) { currentUser.set(user); }手工给ThreadLocal 变量赋值(user),
要获得User对象时,可以使用 User u = (User)currentUser.get();即直接调用get()方法,来返回set()方法所设置的值(也可以不写
此方法,而直接在定义变量时,重写initialValue()方法,此方法返回所要设置的值或对象),这里是User对象,然后调用User类的其他方法.

分享到:
评论

相关推荐

    Java中ThreadLocal的设计与使用

    ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自保存独立的变量副本,互不影响。ThreadLocal的主要优点在于避免了线程之间的数据共享...

    ThreadLocal

    #### 一、ThreadLocal简介与重要性 ThreadLocal是一个非常重要的Java并发工具类,它的核心概念在于为每一个线程提供了一个独立的变量副本,从而避免了线程之间的数据竞争问题。这使得每个线程在访问ThreadLocal变量...

    理解threadlocal

    #### 一、ThreadLocal简介 `ThreadLocal`是一个非常有用的类,它在Java 1.2版本中被引入到`java.lang`包中。其主要功能是在多线程环境中为每个线程提供独立的变量副本,从而避免了线程之间的数据竞争和同步问题。`...

    深入理解ThreadLocal工作原理及使用示例

    ThreadLocal简介和使用示例 ThreadLocal只有一个无参的构造方法public ThreadLocal(),它的相关方法包括: * public T get():获取当前线程的变量副本 * public void set(T value):设置当前线程的变量副本 * ...

    ThreadLocal简介_动力节点Java学院整理

    ThreadLocal简介 ThreadLocal是Java语言中的一种机制,用于解决多线程并发问题。它提供了一种容器,用于存放线程的局部变量,从而实现线程安全。 ThreadLocal的概念可以追溯到JDK 1.2时代,当时它是为了解决多...

    正确理解ThreadLocal

    **一、ThreadLocal简介** 1. **概念**:ThreadLocal并非是一个线程对象,而是一个线程局部变量的容器。每个线程都拥有自己的ThreadLocal实例,存储在这个实例中的变量只对当前线程可见,其他线程无法访问。 2. **...

    Java单线程ThreadLocal串值问题解决方案

    ThreadLocal简介 ThreadLocal是Java中的一种机制,用于在多线程环境下,提供线程间隔离的变量访问机制。它可以使得每个线程都拥有自己的变量副本,从而避免了多线程环境下的变量竞争问题。 ThreadLocal的使用 在...

    对ThreadLocal的理解【源码分析+应用举例】

    但是使用ThreadLocal对象去存储一个共享资源时,每一个线程的副本变量都指向同一个共享资源,这里也是会存在线程安全问题的。 ThreadLocal设计初衷:提供线程内部的局部变量,在本线程内随时随地可取,隔离其他线程...

    苍穹外卖-共享当前登录用户ID.docx

    #### 二、ThreadLocal简介 `ThreadLocal`是一种Java内置的线程局部变量,它为每一个使用该变量的线程都提供了一个独立的变量副本,从而避免了多线程环境下的数据竞争问题。这使得`ThreadLocal`非常适合用来保存每个...

    [] - 2022-09-28 ThreadLocal 你真的会用吗?.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能

    廖雪峰python3 完整带索引,图片 最新教程 pdf版

    ThreadLocal 进程 vs. 线程 分布式进程 正则表达式 常用内建模块 datetime collections base64 struct hashlib hmac itertools contextlib urllib XML HTMLParser 常用第三方模块 Pillow requests chardet psutil ...

    Python 3教程(廖雪峰).rar

    ThreadLocal 285 进程 vs. 线程 289 分布式进程 292 正则表达式 298 常用内建模块 304 datetime 305 collections 312 base64 317 struct 320 hashlib 322 itertools 327 contextlib 331 XML 336 ...

    通往架构师之路(全27)

    7 漫谈使用ThreadLocal改进你的层次划分 8 weblogic与apache的整合与调优 9 weblogic的集群与配置 10 Axis2 Web Service 一 11 Axis2 Web Service 二 12 Axis2 Web Service 三 个人认为内容非常好 所以...

    廖雪峰的python3

    进程和线程部分介绍了多进程、多线程、ThreadLocal、进程与线程的比较和分布式进程。网络编程则包括TCP/IP简介、TCP编程、UDP编程、电子邮件处理如SMTP发送邮件和POP3收取邮件。数据库访问部分讲解了使用SQLite、...

    通往架构师之路

    7、漫谈使用ThreadLocal改进你的层次划分 8、weblogic与apache的整合与调优 9、weblogic的集群与配置 10、Axis2 Web Service(一) 11、Axis2 Web Service(二) 12、Axis2 Web Service(三) 个人认为内容非常好,...

    C#.NET 2005简介

    它们与LINQ(Language Integrated Query,语言集成查询)配合使用,使数据查询变得更加简单,极大地提升了数据处理的能力。 C#.NET 2005还引入了迭代器,这是一种可以控制迭代过程的方法。通过使用yield关键字,...

    CoreJava资料

    2.1 类与对象:理解类的定义、对象的创建与使用,以及类的封装、继承和多态性。 2.2 构造函数:掌握构造函数的作用和用法,以及构造函数的重载。 2.3 访问修饰符:理解public、private、protected和默认访问修饰符的...

    Spring 2.0 开发参考手册

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    (源码)基于Java的心电信号R点标注系统.zip

    # 基于Java的心电信号R点标注系统 ## 项目简介 本项目是一个基于Java的心电信号R点标注系统,旨在通过处理心电图... 使用ThreadLocal确保每个线程都有独立的处理器实例,避免多线程间的数据干扰。 ## 安装使用步骤

Global site tag (gtag.js) - Google Analytics