threadlocal的实现,原理
发表于|更新于
|浏览量:|

threadlocal的实现,原理
1. threadlocal的概念
ThreadLocal是Java中的一个线程本地变量,它可以为每个线程存储一份独立的变量副本,不同线程之间互不影响。ThreadLocal的实现原理是通过ThreadLocalMap来实现的,每个Thread对象都有一个ThreadLocalMap对象,用于存储线程本地变量。
2. threadlocal的使用
public class ThreadLocalDemo { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void main(String[] args) { threadLocal.set(1); System.out.println(threadLocal.get()); threadLocal.remove(); } }
|
3. threadlocal的实现原理
ThreadLocal的实现原理是通过ThreadLocalMap来实现的,ThreadLocalMap是ThreadLocal的一个内部类,用于存储线程本地变量。ThreadLocalMap是一个Entry数组,每个Entry对象包含一个ThreadLocal对象和一个变量值。
static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal<?>> { Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } }
|
ThreadLocalMap的put方法用于存储线程本地变量,getEntry方法用于获取线程本地变量,remove方法用于删除线程本地变量。
void set(ThreadLocal<?> key, Object value) { Entry[] tab = table; int len = tab.length; int i = key.threadLocalHashCode & (len-1); for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) { ThreadLocal<?> k = e.get(); if (k == key) { e.value = value; return; } if (k == null) { replaceStaleEntry(key, value, i); return; } } tab[i] = new Entry(key, value); int sz = ++size; if (!cleanSomeSlots(i, sz) && sz >= threshold) rehash(); }
|
ThreadLocalMap的getEntry方法用于获取线程本地变量,如果线程本地变量不存在,则返回null。
Entry getEntry(ThreadLocal<?> key) { int i = key.threadLocalHashCode & (table.length - 1); Entry e = table[i]; if (e != null && e.get() == key) return e; else return getEntryAfterMiss(key, i, e); }
|