ThreadLocal的使用与原理
2017-07-16 22:52
381 查看
1. 使用场景
使用单个线程保存上下文信息可以使得本来线程不安全的类变得安全,例如DateFormat,如果每个线程只有一个DateFormat,那么就是安全的
承载一些线程的信息,放在在方法调用的时候来回传递参数
2. 使用方法
@Test public void testThreadLocal() throws InterruptedException { AtomicInteger count = new AtomicInteger(0); ThreadFactory threadFactory = new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(r,"Thread:" + count.incrementAndGet()); } }; ThreadLocal<Integer> idThreadLocal = new ThreadLocal<>(); Thread thread1 = threadFactory.newThread(new LoginLogRunnable(1, idThreadLocal)); Thread thread2 = threadFactory.newThread(new LoginLogRunnable(2, idThreadLocal)); thread1.start(); thread2.start(); Thread.sleep(10000); } static class LoginLogRunnable implements Runnable { private Integer id; private ThreadLocal<Integer> idThreadLocal; public LoginLogRunnable(Integer id, ThreadLocal<Integer> idThreadLocal) { this.id = id; this.idThreadLocal = idThreadLocal; } @Override public void run() { idThreadLocal.set(id); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + idThreadLocal.get()); } }
例如上面的代码,我们只需要set进自己的值,当获取的时候通过ThreadLocal.get()就可以获取到我们set的值。
原理
当我们set的时候发生了什么?ThreadLocal如何实现一个修改数据的时候,不会影响到别的别的线程的数据。如图所示,一个Thread会包含一个ThreadLocaMap用来保存一个线程的成员变量,而Entry的每个节点的value对应的是值。
当我们set值的时候,会获取当前线程的ThreadLocalMap,然后将将key为ThreadLocal实例、value为对应值的Entry,添加进ThreadLocalMap。get的时候也是相同的道理。
注意点
1.即使Entry的key是若引用,如果在set值以后不再访问,但由于value是强引用,所以也无法正常释放内存,有可能造成内存泄漏
ThreadLocal如果不使用了的话,最好是调用remove方法释放掉对应的内存。
相关文章推荐
- java并发(2)ThreadLocal的使用及实现原理(使用)
- ThreadLocal使用、场景、原理
- java多线程模式ThreadLocal原理简述及其使用详解
- ThreadLocal使用和原理
- ThreadLocal原理分析与使用场景
- ThreadLocal的实现原理,及使用实例,解决spring,hibernate非web项目下的懒加载 no session or session was closed(1)!
- ThreadLocal 原理和使用场景分析
- java ThreadLocal(应用场景及使用方式及原理)
- java ThreadLocal(应用场景及使用方式及原理)
- ThreadLocal(应用场景及使用方式及原理)
- java ThreadLocal(应用场景及使用方式及原理)
- java并发编程学习: ThreadLocal使用及原理
- ThreadLocal原理和项目中如何使用
- java多线程模式ThreadLocal原理简述及其使用详解
- 多线程编程之ThreadLocal的使用和内在原理
- ThreadLocal使用及原理
- ThreadLocal的实现原理,及使用实例,解决spring,hibernate非web项目下的懒加载 no session or session was closed(2)!
- J.U.C--ThreadLocal的应用与使用原理
- 聊聊ThreadLocal原理以及使用场景-JAVA 8源码
- J.U.C--ThreadLocal的应用与使用原理