深入理解Java中的ThreadLocal

打印 上一主题 下一主题

主题 984|帖子 984|积分 2952

转自:
http://www.java265.com/JavaCourse/202205/3370.html
下文笔者讲述java中ThreadLocal的详解说明,如下所示:
ThreadLocal简介
  1. <strong>ThreadLocal的功能:
  2.    用于创建线程局部变量的类
  3. ----------------------------------------------------------------------------
  4. 我们都知道我们创建的变量,可以被任何一个线程访问和修改
  5. 但是当我们使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改
  6. -------------------------------------------------------------------------</strong>----
复制代码
ThreaLocal用法示例
  1. ThreadLocal定义:
  2.    ThreadLocal<String> threadLocalInfo = new ThreadLocal<>();
  3. set方法
  4.    threadLocalInfo.set("java265.com");
  5. get方法
  6.    threadLocalInfo.get();
  7. 完整的示例
  8. private void testThreadLocal() {
  9.     Thread t = new Thread() {
  10.         ThreadLocal<String> threadLocalInfo = new ThreadLocal<>();
  11.         @Override
  12.         public void run() {
  13.             super.run();
  14.             threadLocalInfo.set("java265.com--我最爱的网站");
  15.             threadLocalInfo.get();
  16.         }
  17.     };
  18.     t.start();
  19. }
复制代码
ThreadLocal初始值--设置方法

ThreadLocal设置默认的get初始值
  需要重写initialValue方法
  1. 例:
  2. ThreadLocal<String> mThreadLocal = new ThreadLocal<String>() {
  3.     @Override
  4.     protected String initialValue() {
  5.       return Thread.currentThread().getName();
  6.     }
  7. };
复制代码
ThreadLocal的set方法原理说明
  1. set方法源码:
  2. public void set(T value) {
  3.     Thread t = Thread.currentThread();
  4.     ThreadLocalMap map = getMap(t);
  5.     if (map != null)
  6.         map.set(this, value);
  7.     else
  8.         createMap(t, value);
  9. }
  10. getMap:
  11. ThreadLocalMap getMap(Thread t) {
  12.     return t.threadLocals;
  13. }
  14. class Thread implements Runnable {
  15.     ThreadLocal.ThreadLocalMap threadLocals = null;
  16. }
  17. 当一开始设置,即ThreadLocalMap对象未创建
  18. 则新建ThreadLocalMap对象,并设置初始值
  19. void createMap(Thread t, T firstValue) {
  20.     t.threadLocals = new ThreadLocalMap(this, firstValue);
  21. }
复制代码
ThreadLocal导致内存泄露的原因说明
  1.   ThreadLocal实例被线程的ThreadLocalMap实例持有,也可以看成被线程持有。
  2.   当我们使用了线程池,由于之前的线程实例处理完之后出于复用的目的依然存活
  3.   即ThreadLocal设定的值被持有,才会导致内存泄露
  4.   ThreadLocal并不会产生内存泄露
  5.   因为ThreadLocalMap在选择key的时候
  6.   并不是直接选择ThreadLocal实例
  7.    而是ThreadLocal实例的弱引用。
复制代码
[code]static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always a* ThreadLocal object).  Note that null keys (i.e. entry.get()* == null) mean that the key is no longer referenced, so the* entry can be expunged from table.  Such entries are referred to* as "stale entries" in the code that follows.*/    static class Entry extends WeakReference
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表