//add by wuzhuqu 20180512 这里最好用方法,不然很难知道这里也需要修改
if (provideInvoiceType != null) {
sb.append(",provideInvoiceType=").append(getProvideInvoiceType());
}
//add by guke 20180630 这里就是个坑,cookie长度是有限制的,总不能一直往这里面拼接吧,头部的ThreadLocal变量还是要用起来
if (areaId != null) {
sb.append(",areaId=").append(getAreaId());
}
故事,都从科神的一句注释开始。
我从没用过这玩意儿,但是看到每个类似context的类的开头都要来一个。
JDK的注释第一句就说明了它的来意
This class provides thread-local variables.
为每一个使用该变量的线程都提供一个变量值的副本,是java中一种较为特殊的线程绑定机制。
从线程角度看,每个线程都保持一个对其局部变量副本的隐式引用
https://blog.csdn.net/u012099869/article/details/51027236
概括说来,对于多线程资源共享的问题,同步机制采用了“时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者进提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
结合科神的注释联想,是否是用cookie结合ThreadLocal的方式实现无状态登录
https://blog.csdn.net/qq525099302/article/details/46775801
果然有
(后续可以看看jsf中的“基于ThreadLocal的隐式传参”)
先看一哈ThreadLocal的整体结构(好像一直不擅长看这个,可以总结一下方法学)

喏,大佬的读源码系列,这个看完了应该就会看源码了吧
https://blog.csdn.net/liangxw1/article/details/51435308
https://blog.csdn.net/liangxw1/article/details/51435308
(这个比好像有丶东西)
首先看一个jdk里面用到ThreadLocal的例子
import java.util.concurrent.atomic.AtomicInteger;
public class UniqueThreadIdGenerator {
private static final AtomicInteger uniqueId = new AtomicInteger(0);
private static final ThreadLocal < Integer > uniqueNum =
new ThreadLocal < Integer > () {
@Override protected Integer initialValue() {
return uniqueId.getAndIncrement();
}
};
public static int getCurrentThreadId() {
return uniqueId.get();
}
}
龟龟,因为很多设计模式不了解,感觉看JDK总感觉一堆费代码(微笑)
首先我们看看为什么要有ThreadLocal
https://www.cnblogs.com/dolphin0520/p/3920407.html
大致上就是,线程之间需要共享的变量,但是一个的线程对该变量的操作并不会影响别的线程,这种情景。
网友评论