//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采用了“以空間換時間”的方式京景。前者進提供一份變量,讓不同的線程排隊訪問骗奖,而后者為每一個線程都提供了一份變量确徙,因此可以同時訪問而互不影響。
結(jié)合科神的注釋聯(lián)想执桌,是否是用cookie結(jié)合ThreadLocal的方式實現(xiàn)無狀態(tài)登錄
https://blog.csdn.net/qq525099302/article/details/46775801
果然有
(后續(xù)可以看看jsf中的“基于ThreadLocal的隱式傳參”)
先看一哈ThreadLocal的整體結(jié)構(好像一直不擅長看這個鄙皇,可以總結(jié)一下方法學)
喏,大佬的讀源碼系列仰挣,這個看完了應該就會看源碼了吧
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
大致上就是膘壶,線程之間需要共享的變量错蝴,但是一個的線程對該變量的操作并不會影響別的線程,這種情景颓芭。