static修饰的变量是放在方法区中的,JVM不会回收方法区中的对象,由于hashMap不会被回收,而hashMap中又一直在用着MythreadLocal对象,所以导致MythreadLocal不会被回收
static修饰的变量是放在方法区中的,JVM不会回收方法区中的对象,由于hashMap不会被回收,而hashMap中又一直在用着MythreadLocal对象,所以导致MythreadLocal不会被回收
jdk11的新特性
你版本比较旧噢, 我是java11
this 就是这个类本身
HashMap。本身就不是线程安全的,所以 你这个写法 我暂时不确定 是不是能正确的运行
但是既然不是线程安全的 所以 我觉得 不可以这样写
如果你加个锁 确实可以 变成安全的 操作
但是就会 变成多线程 竞争锁 非常消耗性能
虽然实现了 类似功能 但是性能 太低
所以JDK 不会这样设计
秋田君说的也很不错, 我这里补充下, Map<Thread, T>这种结构,hash表冲突会很严重,举个例子。map.put(thread1, 100);map.put(thread1, 200);map.put(thread1, 300);你发现没有,一个map put了三个值,那取值的时候, 怎么办呢?
“用两层HashMap是由于一个线程中可能会拥有多个ThreadLocal成员变量,所以内层HashMap是为了保存同一个线程中的不同ThreadLocal变量。”说法不对吧 如果一个线程中有两个ThreadLocal成员变量,那么按照你说的,他们的key是当前线程ThreadLocal值,那不是key冲突了?