public class ScopedTransferableThreadLocal<T>
extends BaseScope
有作用域的可传递的 ThreadLocal
实现 Scopable 接口, 标识有作用域, 保证值的创建与删除无误 1.1 在作用域开始时创建, 保证多线程切换作用域时不污染新的作用域 1.2 在作用域结束时删除, 针对 ThreadLocal 逃逸现象, 防止内存泄露 1.3 Scopable的 beginScope()/endScope() 必须保证被调用
自动刷新与删除 2.1 beginScope()中刷新 2.2 endScope()中删除
切换线程时传输, 参考 SttlInterceptor
所有的get()/set()操作必须在作用域内执行, 也就是说必须先调用 beginScope()
值的变动 vs 超出作用域的引用 endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断 可能同一个线程读两次get(), 读的值不一样, 第一次不为null, 第二次为null, 具体以其他线程修改的时间或endScope()调用的时间为准 不过我本意是将 endScope() 交给开发者来自行调用, 从而保证 endScope() 是最后调用的, 往后不会有后续引用了, 从而保证不会作用域逃逸
| 限定符和类型 | 类和说明 |
|---|---|
static class |
ScopedTransferableThreadLocal.Companion |
IScope.DefaultImpls| 限定符和类型 | 字段和说明 |
|---|---|
static ScopedTransferableThreadLocal.Companion |
Companion |
| 构造器和说明 |
|---|
ScopedTransferableThreadLocal(kotlin.jvm.functions.Function0<? extends T> supplier)
有作用域的可传递的 ThreadLocal
|
ScopedTransferableThreadLocal()
有作用域的可传递的 ThreadLocal
|
| 限定符和类型 | 方法和说明 |
|---|---|
void |
doBeginScope()
作用域开始
开始新值, 如果有旧值, 就删掉
|
void |
doEndScope()
作用域结束
删除值, 要删除所有被传递的线程的值
endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断
|
T |
get(boolean initOnNull)
获得值
endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断
可能同一个线程读两次get(), 读的值不一样, 第一次不为null, 第二次为null, 具体以其他线程修改的时间或endScope()调用的时间为准
|
kotlin.jvm.functions.Function0<T> |
getSupplier() |
void |
set(T value)
设置值
只能在作用域内部调用, 否则无法在作用域结束时自动删除
|
addChildScope, addChildScope, beginScope, doBeginScope, doEndScope, endScope, getChildScopes, newScopeaddChildScope, addChildScope, beginScope, endScope, newScopepublic static ScopedTransferableThreadLocal.Companion Companion
public ScopedTransferableThreadLocal(kotlin.jvm.functions.Function0<? extends T> supplier)
有作用域的可传递的 ThreadLocal
实现 Scopable 接口, 标识有作用域, 保证值的创建与删除无误 1.1 在作用域开始时创建, 保证多线程切换作用域时不污染新的作用域 1.2 在作用域结束时删除, 针对 ThreadLocal 逃逸现象, 防止内存泄露 1.3 Scopable的 beginScope()/endScope() 必须保证被调用
自动刷新与删除 2.1 beginScope()中刷新 2.2 endScope()中删除
切换线程时传输, 参考 SttlInterceptor
所有的get()/set()操作必须在作用域内执行, 也就是说必须先调用 beginScope()
值的变动 vs 超出作用域的引用 endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断 可能同一个线程读两次get(), 读的值不一样, 第一次不为null, 第二次为null, 具体以其他线程修改的时间或endScope()调用的时间为准 不过我本意是将 endScope() 交给开发者来自行调用, 从而保证 endScope() 是最后调用的, 往后不会有后续引用了, 从而保证不会作用域逃逸
public ScopedTransferableThreadLocal()
有作用域的可传递的 ThreadLocal
实现 Scopable 接口, 标识有作用域, 保证值的创建与删除无误 1.1 在作用域开始时创建, 保证多线程切换作用域时不污染新的作用域 1.2 在作用域结束时删除, 针对 ThreadLocal 逃逸现象, 防止内存泄露 1.3 Scopable的 beginScope()/endScope() 必须保证被调用
自动刷新与删除 2.1 beginScope()中刷新 2.2 endScope()中删除
切换线程时传输, 参考 SttlInterceptor
所有的get()/set()操作必须在作用域内执行, 也就是说必须先调用 beginScope()
值的变动 vs 超出作用域的引用 endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断 可能同一个线程读两次get(), 读的值不一样, 第一次不为null, 第二次为null, 具体以其他线程修改的时间或endScope()调用的时间为准 不过我本意是将 endScope() 交给开发者来自行调用, 从而保证 endScope() 是最后调用的, 往后不会有后续引用了, 从而保证不会作用域逃逸
public void set(T value)
设置值 只能在作用域内部调用, 否则无法在作用域结束时自动删除
public T get(boolean initOnNull)
获得值 endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断 可能同一个线程读两次get(), 读的值不一样, 第一次不为null, 第二次为null, 具体以其他线程修改的时间或endScope()调用的时间为准
public void doBeginScope()
作用域开始 开始新值, 如果有旧值, 就删掉
public void doEndScope()
作用域结束 删除值, 要删除所有被传递的线程的值 endScope() 可能随时随地调用, 也就是说 SttlValue 随时可能被删除, 但可能某个线程调用了 SttlInterceptor.intercept(回调), 但此时回调还没触发, 也就是旧的 ScopedTransferableThreadLocal 对象还未恢复, 等恢复后引用的 SttlValue 却应该被删掉, 因此添加 deleted 属性来做是否已删除的判断
public kotlin.jvm.functions.Function0<T> getSupplier()