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());
}
}
输出结果如下:
引用
62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022
通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。
顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。
ThreadLocal 可以用于session等的保存,有很广泛的用途。
分享到:
相关推荐
Java基础:Java概念、基础语法、面向对象的理解、String类、Object类、序列化、泛型、注解与反射、JDK1.8新特性等;Java集合:List底层实现、Map底层实现等;Java并发编程:ThreadLocal、Java内存模型、锁、并发工具...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备AOP特性,从代理技术讲到AOP技术,从ThreadLocal技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展Web服务插件与安全控制插件为例,教会...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备AOP特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为例...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。*后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
【基础】java多态的理解 13 【基础】transient关键字 15 【基础】访问修饰符区别 15 【基础】java基本数据类型(四类八种) 15 Java自动类型转换 16 数据类型自动提升(注意以下讨论的是二元操作符) 16 【基础】...