首先有几点需要大家清楚的:
1、 ThreadLocal只是对需要存储的对象的管理,而存储实际是由当前Thread负责。个人理解为ThreadLocal是一个操作Thread. threadLocals 的工具。
2、 使用ThreadLocal可以使对象达到线程隔离的目的。同一个ThreadLocal操作不同的Thread,实质是各个Thread对自己的变量操作。
3、 为什么要使用ThreadLocal,个人感觉有两个原因,1是与其它线程的隔离,2是可以在一个线程的生命周期中使用同一个对象,达到对象传递的作用。这样的好处是可以减少dal访问或者ws调用。
我这里列出一个用到ThreadLocal的例子,主要的作用是使用ThreadLocal记录用户信息以及记录用户的执行时间。这在实际应用中,可以映射为全局记录用户的权限,以及使用Threadlocal对系统的性能做一些分析等。。
首先有两个对象,一个是用户对象
// 简单记录用户是否可以访问,可以用于全局权限控制等
class User {
private String name;
private boolean isAllow;
public User(String name, boolean isAllow) {
this.name = name;
this.isAllow = isAllow;
}
public String getName() {
return name;
}
public boolean isAllow() {
return isAllow;
}
@Override
public String toString() {
return "用户名:" + name + "\t 是否允许访问:" + isAllow;
}
}
另一个是消费时间对象
// 用于记录每一步骤耗时…,可以用于每一步的性能分析
class TimeConsumer {
// 名称
private String name;
// 耗时数据列表
private List<Long> steps;
public TimeConsumer(String name, long start) {
this.name = name;
steps = new ArrayList<Long>();
steps.add(start);
}
public void andStep(long step) {
steps.add(step);
}
@Override
public String toString() {
StringBuffer br = new StringBuffer("操作[" + name + "]共有"
+ (steps.size() - 1) + "步\n");
for (int i = 1; i < steps.size(); i++) {
br.append("\t|--耗时[" + (steps.get(i) - steps.get(0))
+ "ms]\n");
}
br.append("\n");
return br.toString();
}
}
接下来,建立一个对这两个对象管理的ThreadLocal的类
// threadlocal 管理类
class MyThreadLocal {
// 用于全局记录user访问权限
private ThreadLocal<User> userLocal;
// 用于全局记录用户每一步的耗时
private ThreadLocal<TimeConsumer> timeLocal;
private static MyThreadLocal local = new MyThreadLocal();
private MyThreadLocal() {
userLocal = new ThreadLocal<User>();
timeLocal = new ThreadLocal<TimeConsumer>();
}
public static MyThreadLocal getInstanse() {
return local;
}
public void addUser(User user) {
userLocal.set(user);
}
public User getUser() {
return userLocal.get();
}
public void addTime(TimeConsumer timeConsumer) {
timeLocal.set(timeConsumer);
}
public void addTime(long l) {
TimeConsumer time = timeLocal.get();
timeLocal.remove();
time.andStep(l);
timeLocal.set(time);
}
public TimeConsumer getTime() {
return timeLocal.get();
}
}
接下来就可以对Threadlocal进行测试了。为了模拟多线程,我这里自己实现了多线程
public class CoreThreadLocal {
public static void main(String[] args) {
new Thread(new TestRunnable("name1", 1000L, true)).start();
new Thread(new TestRunnable("name2", 700L, true)).start();
new Thread(new TestRunnable("name3", 888, false)).start();
}
}
// 用于测试,多线程实现
class TestRunnable implements Runnable {
String name;
long l;
boolean isAllow;
TestRunnable(String name, long l, boolean isAllow) {
this.name = name;
this.l = l;
this.isAllow = isAllow;
}
public void run() {
MyThreadLocal local = MyThreadLocal.getInstanse();
local.addUser(new User(name, isAllow));
local.addTime(new TimeConsumer(name, System.currentTimeMillis()));
// 做某个业务,并记录时间
doThings(l);
local.addTime(System.currentTimeMillis());
// 做某个业务,并记录时间
doThings(l);
local.addTime(System.currentTimeMillis());
// 业务做完,打印日志
System.out.println(local.getUser());
System.out.println(local.getTime());
}
// 模拟具体业务的处理步骤
private void doThings(long l) {
try {
Thread.sleep(l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行上面的程序得到结果如下:
用户名:name2 是否允许访问:true
操作[name2]共有2步
|--耗时[703ms]
|--耗时[1406ms]
用户名:name3 是否允许访问:false
操作[name3]共有2步
|--耗时[891ms]
|--耗时[1781ms]
用户名:name1 是否允许访问:true
操作[name1]共有2步
|--耗时[1000ms]
|--耗时[2000ms]
通过上面的测试程序,可以大概了解ThreadLocal的使用方法以及作用。
如果要深入使用,建议还是看下源码吧…
分享到:
相关推荐
关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...
主要介绍ThreadLocal的原理,实例分析以及注意事项
主要介绍了Android 中 ThreadLocal使用示例的相关资料,这里提供示例代码帮助大家学习理解这部分内容,需要的朋友可以参考下
主要介绍了ThreadLocal使用案例分析,需要的朋友可以参考下
主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal<T> 简介和使用示例及ThreadLocal的原理等相关内容,具有一定参考价值,需要的朋友可以了解下。
主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date...介绍ThreadLocal使用demoThreadLocal源码探索ThreadLocal注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...
主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下
主要介绍了Android 中ThreadLocal的深入理解的相关资料,希望通过本文能帮助到大家,让大家理解应用ThreadLocal,需要的朋友可以参考下
主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下
ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。使用这个工具类可以很简洁地编写出优美的多线程程序。接下来通过本文给大家介绍Java中的ThreadLocal,需要的朋友可以参考下
主要介绍了JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解,需要的朋友可以参考下
主要介绍了Java 并发编程之ThreadLocal详解及实例的相关资料,需要的朋友可以参考下
主要介绍了从面试中的问题分析ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
目录一、背景介绍二、TestNG多线程详解2.1 TestNG多线程实现2.2 TestNG多线程效果演示三、ThreadLocal3.1 ThreadLocal概念3.2 具体实现 一、背景介绍 在使用Selenium+TestNG做WebUI自动化过程中,为了能够加快Web...
主要介绍了详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了关于ThreadLocal对request和response的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧