Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
阿啄debugIT
transmittable-thread-local
提交
bac84a61
T
transmittable-thread-local
项目概览
阿啄debugIT
/
transmittable-thread-local
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
transmittable-thread-local
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bac84a61
编写于
12月 31, 2019
作者:
oldratlee
🔥
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add disableIgnoreNullValueSemantics option for TransmittableThreadLocal #157
上级
3d63f49d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
54 addition
and
15 deletion
+54
-15
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
+54
-15
未找到文件。
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
浏览文件 @
bac84a61
...
...
@@ -63,6 +63,42 @@ import java.util.logging.Logger;
public
class
TransmittableThreadLocal
<
T
>
extends
InheritableThreadLocal
<
T
>
implements
TtlCopier
<
T
>
{
private
static
final
Logger
logger
=
Logger
.
getLogger
(
TransmittableThreadLocal
.
class
.
getName
());
private
final
boolean
disableIgnoreNullValueSemantics
;
/**
* @see #TransmittableThreadLocal(boolean)
*/
public
TransmittableThreadLocal
()
{
this
(
false
);
}
/**
* "Ignore-Null-Value Semantics":
*
* <ol>
* <li>If value is {@code null}(check by {@link #get()} method), do NOT transmit this {@code ThreadLocal}.</li>
* <li>If set {@code null} value, also remove value(invoke {@link #remove()} method).</li>
* </ol>
* <p>
* This is a pragmatic design decision:
* <ol>
* <li>use explicit value type rather than {@code null} to biz intent.</li>
* <li>more safe(avoid {@code NPE}) and gc friendly.</li>
* </ol>
* <p>
* So it's not recommended to use {@code null} value.
* <p>
* But the behave of "Ignore-Null-Value Semantics" is NOT compatible with {@link ThreadLocal} and {@link InheritableThreadLocal},
* you can set parameter {@code disableIgnoreNullValueSemantics}.
* <p>
* More info see <a href="https://github.com/alibaba/transmittable-thread-local/issues/157">Issue #157</a>.
*
* @param disableIgnoreNullValueSemantics disable "Ignore-Null-Value Semantics"
*/
public
TransmittableThreadLocal
(
boolean
disableIgnoreNullValueSemantics
)
{
this
.
disableIgnoreNullValueSemantics
=
disableIgnoreNullValueSemantics
;
}
/**
* Computes the value for this transmittable thread-local variable
* as a function of the source thread's value at the time the task
...
...
@@ -112,7 +148,7 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> imple
@Override
public
final
T
get
()
{
T
value
=
super
.
get
();
if
(
null
!=
value
)
addValue
();
if
(
disableIgnoreNullValueSemantics
||
null
!=
value
)
addValue
();
return
value
;
}
...
...
@@ -121,10 +157,13 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> imple
*/
@Override
public
final
void
set
(
T
value
)
{
super
.
set
(
value
);
// may set null to remove value
if
(
null
==
value
)
removeValue
();
else
addValue
();
if
(!
disableIgnoreNullValueSemantics
&&
null
==
value
)
{
// may set null to remove value
remove
();
}
else
{
super
.
set
(
value
);
addValue
();
}
}
/**
...
...
@@ -152,17 +191,17 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> imple
// - and never be used.
// 2.2 WeakHashMap support *null* value.
private
static
InheritableThreadLocal
<
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>>
holder
=
new
InheritableThreadLocal
<
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>>()
{
@Override
protected
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
initialValue
()
{
return
new
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
Object
>();
}
new
InheritableThreadLocal
<
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>>()
{
@Override
protected
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
initialValue
()
{
return
new
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
Object
>();
}
@Override
protected
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
childValue
(
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
parentValue
)
{
return
new
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
Object
>(
parentValue
);
}
};
@Override
protected
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
childValue
(
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
?>
parentValue
)
{
return
new
WeakHashMap
<
TransmittableThreadLocal
<
Object
>,
Object
>(
parentValue
);
}
};
@SuppressWarnings
(
"unchecked"
)
private
void
addValue
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录