mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Update 万字详解ThreadLocal关键字.md
This commit is contained in:
parent
0abe6e1143
commit
fdcf1671b9
@ -186,7 +186,7 @@ public void set(T value) {
|
||||
}
|
||||
|
||||
void createMap(Thread t, T firstValue) {
|
||||
t.threadLocals = new `ThreadLocalMap`(this, firstValue);
|
||||
t.threadLocals = new ThreadLocalMap(this, firstValue);
|
||||
}
|
||||
```
|
||||
|
||||
@ -338,7 +338,7 @@ private void set(ThreadLocal<?> key, Object value) {
|
||||
for (Entry e = tab[i];
|
||||
e != null;
|
||||
e = tab[i = nextIndex(i, len)]) {
|
||||
`ThreadLocal`<?> k = e.get();
|
||||
ThreadLocal<?> k = e.get();
|
||||
|
||||
if (k == key) {
|
||||
e.value = value;
|
||||
@ -420,7 +420,7 @@ private void replaceStaleEntry(ThreadLocal<?> key, Object value,
|
||||
(e = tab[i]) != null;
|
||||
i = nextIndex(i, len)) {
|
||||
|
||||
`ThreadLocal`<?> k = e.get();
|
||||
ThreadLocal<?> k = e.get();
|
||||
|
||||
if (k == key) {
|
||||
e.value = value;
|
||||
@ -551,7 +551,7 @@ private int expungeStaleEntry(int staleSlot) {
|
||||
for (i = nextIndex(staleSlot, len);
|
||||
(e = tab[i]) != null;
|
||||
i = nextIndex(i, len)) {
|
||||
`ThreadLocal`<?> k = e.get();
|
||||
ThreadLocal<?> k = e.get();
|
||||
if (k == null) {
|
||||
e.value = null;
|
||||
tab[i] = null;
|
||||
@ -602,7 +602,7 @@ if (h != i) {
|
||||
|
||||
### `ThreadLocalMap`扩容机制
|
||||
|
||||
在``ThreadLocalMap.set()`方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中`Entry`的数量已经达到了列表的扩容阈值`(len*2/3)`,就开始执行`rehash()`逻辑:
|
||||
在`ThreadLocalMap.set()`方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中`Entry`的数量已经达到了列表的扩容阈值`(len*2/3)`,就开始执行`rehash()`逻辑:
|
||||
|
||||
```java
|
||||
if (!cleanSomeSlots(i, sz) && sz >= threshold)
|
||||
@ -653,7 +653,7 @@ private void resize() {
|
||||
for (int j = 0; j < oldLen; ++j) {
|
||||
Entry e = oldTab[j];
|
||||
if (e != null) {
|
||||
`ThreadLocal`<?> k = e.get();
|
||||
ThreadLocal<?> k = e.get();
|
||||
if (k == null) {
|
||||
e.value = null;
|
||||
} else {
|
||||
@ -711,7 +711,7 @@ private Entry getEntryAfterMiss(ThreadLocal<?> key, int i, Entry e) {
|
||||
int len = tab.length;
|
||||
|
||||
while (e != null) {
|
||||
`ThreadLocal`<?> k = e.get();
|
||||
ThreadLocal<?> k = e.get();
|
||||
if (k == key)
|
||||
return e;
|
||||
if (k == null)
|
||||
@ -773,7 +773,7 @@ public class InheritableThreadLocalDemo {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("子线程获取父类`ThreadLocal`数据:" + `ThreadLocal`.get());
|
||||
System.out.println("子线程获取父类ThreadLocal数据:" + ThreadLocal.get());
|
||||
System.out.println("子线程获取父类inheritableThreadLocal数据:" + inheritableThreadLocal.get());
|
||||
}
|
||||
}).start();
|
||||
@ -784,7 +784,7 @@ public class InheritableThreadLocalDemo {
|
||||
打印结果:
|
||||
|
||||
```java
|
||||
子线程获取父类`ThreadLocal`数据:null
|
||||
子线程获取父类ThreadLocal数据:null
|
||||
子线程获取父类inheritableThreadLocal数据:父类数据:inheritableThreadLocal
|
||||
```
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user