image-20240420163459407

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);
}