ThreadLocal实现线程范围的共享变量

ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另一个线程中则共享另一份数据,线程的数据是独享的。

ThreadLocal的实现原理:每个线程调用全局ThreadLocal的set方法,就相当于往其内部的Map中增加一条记录,key是各自的线程,value是各自的线程调用set放进的值。在线程结束时可以调用ThreadLocal.clear()方法,可以立即释放内存。也可以不调用,线程运行完成之后内存也会被回收。

ThreadLocal的应用场景:

(1)订单处理

(2)银行转账等

Struts2中ActionContext,同一段代码被不同的线程调用运行时,该代码操纵的是各自的线程的状态和数据。对于不同的线程来说,getContext()拿到的对象都不同,不管拿多少次,不管在哪个模块,这一个线程拿到的都是同一个对象。

下面是一个关于ThreadLocal的例子:

package thread.tradtionnal; import java.util.HashMap; import java.util.Map; import java.util.Random; public class ThreadLocalTest { //public static int data; /** * @param args */ public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override public void run() { int data = new Random().nextInt(); System.out.println("data---" + data); MyData.getInstance().setAge(data); MyData.getInstance().setName(Thread.currentThread()+"-"+data); new ThreadA().getData(); new ThreadB().getData(); } }).start(); } } static class ThreadA{ public void getData(){ System.out.println("ThreadA -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName()); } } static class ThreadB{ public void getData(){ System.out.println("ThreadB -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName()); } } } class MyData{ private String name; private int age; private static MyData instance = null; private static ThreadLocal<MyData> map = new ThreadLocal<MyData>(); private MyData(){}; public static MyData getInstance(){ instance = map.get(); if( instance == null){ instance = new MyData(); map.set(instance); } return instance; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }


运行结果

data---1874800790 data----781274110 ThreadA -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110 ThreadA -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790 ThreadB -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790 ThreadB -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值