Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
JavaGuide
提交
fdcf1671
J
JavaGuide
项目概览
wushizhenking
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
fdcf1671
编写于
5月 12, 2021
作者:
J
Joe
提交者:
GitHub
5月 12, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 万字详解ThreadLocal关键字.md
上级
0abe6e11
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
9 addition
and
9 deletion
+9
-9
docs/java/multi-thread/万字详解ThreadLocal关键字.md
docs/java/multi-thread/万字详解ThreadLocal关键字.md
+9
-9
未找到文件。
docs/java/multi-thread/万字详解ThreadLocal关键字.md
浏览文件 @
fdcf1671
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录