未验证 提交 fdcf1671 编写于 作者: J Joe 提交者: GitHub

Update 万字详解ThreadLocal关键字.md

上级 0abe6e11
...@@ -186,7 +186,7 @@ public void set(T value) { ...@@ -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) { ...@@ -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, ...@@ -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) { ...@@ -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) { ...@@ -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() { ...@@ -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) { ...@@ -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 { ...@@ -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 { ...@@ -784,7 +784,7 @@ public class InheritableThreadLocalDemo {
打印结果: 打印结果:
```java ```java
子线程获取父类`ThreadLocal`数据:null 子线程获取父类ThreadLocal数据null
子线程获取父类inheritableThreadLocal数据父类数据:inheritableThreadLocal 子线程获取父类inheritableThreadLocal数据父类数据:inheritableThreadLocal
``` ```
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册