JAVA基础特性-ThreadLocal 应用

本文详细介绍了ThreadLocal的概念及其内部实现原理,通过一个具体的示例展示了如何使用ThreadLocal来实现线程间的变量隔离,适用于多线程编程场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适,他实现了线程的变量隔离,不同的线程可以维护自己的变量,
他在内部实现原理上比较简单,就是每个ThreadLocal内定义一个以自己线程名称为key的hashMap,在应用上非常广泛,struts2等框架的每一个Action请求都会被Web容器初始化为一个ActionContext。这样就实现了不同请求的隔离。
下面看一个Demo,通过Demo的演示大概就可以看到 ThreadLocal的应用。


主程序:

/**
* @author job
*
*/
public class ThreadLocalTest {


public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
A.say();
}
});
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
B.say();
}
});
service.shutdown();
}

}


用作共享的参数类:



/**
* @author dingjob
*
*/
class Mydata {
private static ThreadLocal data = new ThreadLocal();
// 防止对象 被new,只能通过get的方法获得。
private Mydata(){
}
int x;
public static Mydata getMydata(){
Mydata mydata = (Mydata)data.get();
if(mydata ==null){
mydata = new Mydata();
data.set(mydata);
}
return mydata;
}
public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}
}


两个简单的service


class A {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}

/**
* @author dingjob
*
*/
class B {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}




输出结果如下:
[quote]
62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022
[/quote]

通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。


顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。


ThreadLocal 可以用于session等的保存,有很广泛的用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值