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) {
|
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];
|
for (Entry e = tab[i];
|
||||||
e != null;
|
e != null;
|
||||||
e = tab[i = nextIndex(i, len)]) {
|
e = tab[i = nextIndex(i, len)]) {
|
||||||
`ThreadLocal`<?> k = e.get();
|
ThreadLocal<?> k = e.get();
|
||||||
|
|
||||||
if (k == key) {
|
if (k == key) {
|
||||||
e.value = value;
|
e.value = value;
|
||||||
@ -420,7 +420,7 @@ private void replaceStaleEntry(ThreadLocal<?> key, Object value,
|
|||||||
(e = tab[i]) != null;
|
(e = tab[i]) != null;
|
||||||
i = nextIndex(i, len)) {
|
i = nextIndex(i, len)) {
|
||||||
|
|
||||||
`ThreadLocal`<?> k = e.get();
|
ThreadLocal<?> k = e.get();
|
||||||
|
|
||||||
if (k == key) {
|
if (k == key) {
|
||||||
e.value = value;
|
e.value = value;
|
||||||
@ -551,7 +551,7 @@ private int expungeStaleEntry(int staleSlot) {
|
|||||||
for (i = nextIndex(staleSlot, len);
|
for (i = nextIndex(staleSlot, len);
|
||||||
(e = tab[i]) != null;
|
(e = tab[i]) != null;
|
||||||
i = nextIndex(i, len)) {
|
i = nextIndex(i, len)) {
|
||||||
`ThreadLocal`<?> k = e.get();
|
ThreadLocal<?> k = e.get();
|
||||||
if (k == null) {
|
if (k == null) {
|
||||||
e.value = null;
|
e.value = null;
|
||||||
tab[i] = null;
|
tab[i] = null;
|
||||||
@ -602,7 +602,7 @@ if (h != i) {
|
|||||||
|
|
||||||
### `ThreadLocalMap`扩容机制
|
### `ThreadLocalMap`扩容机制
|
||||||
|
|
||||||
在``ThreadLocalMap.set()`方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中`Entry`的数量已经达到了列表的扩容阈值`(len*2/3)`,就开始执行`rehash()`逻辑:
|
在`ThreadLocalMap.set()`方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中`Entry`的数量已经达到了列表的扩容阈值`(len*2/3)`,就开始执行`rehash()`逻辑:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
if (!cleanSomeSlots(i, sz) && sz >= threshold)
|
if (!cleanSomeSlots(i, sz) && sz >= threshold)
|
||||||
@ -653,7 +653,7 @@ private void resize() {
|
|||||||
for (int j = 0; j < oldLen; ++j) {
|
for (int j = 0; j < oldLen; ++j) {
|
||||||
Entry e = oldTab[j];
|
Entry e = oldTab[j];
|
||||||
if (e != null) {
|
if (e != null) {
|
||||||
`ThreadLocal`<?> k = e.get();
|
ThreadLocal<?> k = e.get();
|
||||||
if (k == null) {
|
if (k == null) {
|
||||||
e.value = null;
|
e.value = null;
|
||||||
} else {
|
} else {
|
||||||
@ -711,7 +711,7 @@ private Entry getEntryAfterMiss(ThreadLocal<?> key, int i, Entry e) {
|
|||||||
int len = tab.length;
|
int len = tab.length;
|
||||||
|
|
||||||
while (e != null) {
|
while (e != null) {
|
||||||
`ThreadLocal`<?> k = e.get();
|
ThreadLocal<?> k = e.get();
|
||||||
if (k == key)
|
if (k == key)
|
||||||
return e;
|
return e;
|
||||||
if (k == null)
|
if (k == null)
|
||||||
@ -773,7 +773,7 @@ public class InheritableThreadLocalDemo {
|
|||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
System.out.println("子线程获取父类`ThreadLocal`数据:" + `ThreadLocal`.get());
|
System.out.println("子线程获取父类ThreadLocal数据:" + ThreadLocal.get());
|
||||||
System.out.println("子线程获取父类inheritableThreadLocal数据:" + inheritableThreadLocal.get());
|
System.out.println("子线程获取父类inheritableThreadLocal数据:" + inheritableThreadLocal.get());
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
@ -784,7 +784,7 @@ public class InheritableThreadLocalDemo {
|
|||||||
打印结果:
|
打印结果:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
子线程获取父类`ThreadLocal`数据:null
|
子线程获取父类ThreadLocal数据:null
|
||||||
子线程获取父类inheritableThreadLocal数据:父类数据:inheritableThreadLocal
|
子线程获取父类inheritableThreadLocal数据:父类数据:inheritableThreadLocal
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user