import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import trace.visitor.Visitor;
public class Trace {
private static ThreadLocal<ConcurrentHashMap<Class<? extends ITracer>, ITracer>> tracer = new ThreadLocal<ConcurrentHashMap<Class<? extends ITracer>, ITracer>>() {
@Override
protected ConcurrentHashMap<Class<? extends ITracer>, ITracer> initialValue() {
return new ConcurrentHashMap<Class<? extends ITracer>, ITracer>();
}
};
private static ThreadLocal<Boolean> lock = new ThreadLocal<Boolean>() {
@Override
protected Boolean initialValue() {
return Boolean.FALSE;
}
};
public static boolean isStart() {
return lock.get();
}
public static void start() {
lock.set(true);
}
public static void stop() {
lock.set(false);
}
public static void trace(Visitor visitor, ITraceFilter filter) {
if (visitor == null) {
throw new NullPointerException("需要先指定访问者");
}
ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
for (Map.Entry<Class<? extends ITracer>, ITracer> entry : map
.entrySet()) {
ITracer tracer = entry.getValue();
List<? extends AbstractEntry> entrys = tracer.getEntrySet();
for (AbstractEntry e : entrys) {
if (filter == null || filter.accept(e)) {
e.accept(visitor);
}
}
}
}
public static void trace(Visitor visitor) {
trace(visitor, null);
}
public static void reset() {
ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
for (Map.Entry<Class<? extends ITracer>, ITracer> entry : map
.entrySet()) {
ITracer tracer = entry.getValue();
tracer.reset();
}
}
@SuppressWarnings("unchecked")
public static <T extends ITracer> T getTracer(Class<T> clazz) {
ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
try {
map.putIfAbsent(clazz, (T) clazz.newInstance());
return (T) map.get(clazz);
} catch (Exception e) {
throw new RuntimeException("无法获取" + clazz.getName() + "的记录器");
}
}
}
获取一个tracer,调用tracer.debug(×××),记录的东西都保存在ThreadLocal中,最后通过访问者模式暴露给外部使用。可以用来统计方法运行过程中产生的各种日志,以及方法执行的时间,结果等等
分享到:
相关推荐
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
j2ee项目经常需要记录操作者的日志,本demo在ssh框架上运用了spring的aop,加上threadlocal(用户信息,请求信息)完成了日志记录。
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
Synchronized与ThreadLocal
本例以序列号生成的程序为例,展示ThreadLocal的使用
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。