`

java ThreadLocal

阅读更多

import java.io.*;
import java.util.logging.*;
public class SimpleThreadLogger {
	private static final java.lang.ThreadLocal<Logger> threadLocal = new java.lang.ThreadLocal<Logger>();

	// 输出信息
	public static void log(String msg) {
		getThreadLogger().log(Level.INFO, msg);
	}

	// 根据线程获得专属Logger
	private static Logger getThreadLogger() {
		Logger logger = threadLocal.get();
		if (logger == null) {
			try {
				logger = Logger.getLogger(Thread.currentThread().getName());
				// Logger 默认是在主控台输出
				// 我们加入一个文件输出的Handler
				// 它会输出XML的记录文件
				logger.addHandler(new FileHandler(Thread.currentThread().getName() + ".log"));
			} catch (IOException e) {
			}
			threadLocal.set(logger);
		}
		return logger;
	}
}
public class LoggerTest {
	public static void main(String[] args) {
		new TestThread("thread1").start();
		new TestThread("thread2").start();
		new TestThread("thread3").start();
	}
}

class TestThread extends Thread {
	public TestThread(String name) {
		super(name);
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			SimpleThreadLogger.log(getName() + ": message " + i);
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				SimpleThreadLogger.log(e.toString());
			}
		}
	}
}
import java.util.*;
public class ThreadLocal<T> {
	// 获得一个同步化的Map对象
	private Map<Thread, T> storage = Collections
			.synchronizedMap(new HashMap<Thread, T>());
	public T get() {
		// 获得目前执行get()方法的线程
		Thread current = Thread.currentThread();
		// 根据线程获得线程自有的资源
		T t = storage.get(current);
		// 如果还没有线程专用的资源空间
		// 则建立一个新的空间
		if (t == null && !storage.containsKey(current)) {
			t = initialValue();
			storage.put(current, t);
		}
		return t;
	}
	public void set(T t) {
		storage.put(Thread.currentThread(), t);
	}
	public T initialValue() {
		return null;
	}
}

注:使用ThreadLocal,一般都是声明在静态变量中,如果不断的创建ThreadLocal而且没有调用其remove方法,将会导致内存泄露。
分享到:
评论

相关推荐

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    Java ThreadLocal类应用实战案例分析

    主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下

    JAVA ThreadLocal类深入

    深入研究java.lang.ThreadLocal类。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是 threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。

    java 简单的ThreadLocal示例

    java 简单的ThreadLocal示例

    java ThreadLocal使用案例详解

    主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java中ThreadLocal详解

    详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露

    使用Java ThreadLocal.docx

    我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用...

    Java ThreadLocal用法实例详解

    主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下

    Java ThreadLocal 线程安全问题解决方案

    主要介绍了Java ThreadLocal 线程安全问题解决方案的相关资料,需要的朋友可以参考下

    Java ThreadLocal的设计理念与作用

    主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Spring定时任务中使用ThreadLocal的坑

    NULL 博文链接:https://bijian1013.iteye.com/blog/2380233

    彻底理解Java 中的ThreadLocal

    主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下

    ThreadLocal

    利用过滤器去获取request和response,进行将其设置到ThreadLocal从而保证我的请求的安装线,这样就能在java普通类中获取request和response

    java 中ThreadLocal 的正确用法

    主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下

    Java中ThreadLocal的设计与使用

    Java中ThreadLocal的设计与使用.doc

    Java ThreadLocal详解_动力节点Java学院整理

    ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,本文会详细的介绍一下,有兴趣的可以了解一下

    java事务 - threadlocal

    ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量

    深入学习java ThreadLocal的源码知识

    ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,特别适用于各个线程依赖不通的变量值完成操作的场景。下面我们来详细了解一下它吧

    Java资料-详解ThreadLocal

    Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal Java资料—详解ThreadLocal

    Java多线程编程中ThreadLocal类的用法及深入

    早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...

Global site tag (gtag.js) - Google Analytics