ThreadLocal简介与使用

本文详细介绍了ThreadLocal的概念及其在Java中的应用。ThreadLocal为每个线程提供了独立的变量副本,从而避免了多线程间的变量冲突。文章还给出了两种实现方式,并讨论了其常见用途。

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类的其他方法.
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值