有個類的靜態屬性,用threadlocal定義,用static賦值。
public class Variable {
public static ThreadLocal<String> username = new ThreadLocal<String>();
static {
Variable.username.set("aaa");
}
}代碼運行在tomcat上,在之后get的時候,第一次請求get正確,第二次請求get到的是null,請問這是什么原因?
我的需求是每次請求這個靜態屬性都有一個獨立的生命周期,也就是這個屬性在本次請求里是全域共享的,請求結束后就釋放,應該怎么實作?
uj5u.com熱心網友回復:
自己用aop去set,get,removeuj5u.com熱心網友回復:
ThreadLocal 要使用同一個執行緒 ,先進行set然后才能get得到;沒有看到你set,get的代碼,沒法確定是否為同一個執行緒,是否先進行了 set操作uj5u.com熱心網友回復:
你可以列印一下get地方的執行緒名稱,看一下是不是和set的執行緒名稱是一致的,如果不一致就獲取不到,自然就是null了。。uj5u.com熱心網友回復:
是同一次請求里的,沒有remove。
我看了一些資料說tomcat里并非一次請求對應一個執行緒,那應該怎么解決?
uj5u.com熱心網友回復:
估計不是一個執行緒吧...你得每次請求就set,再get,還得保證沒有切換執行緒操作,如果想傳遞,那得重新set,服務之間的通信也是如此uj5u.com熱心網友回復:
你ThreadLocal賦值寫在靜態塊里,那么賦值的是加載這個類的執行緒,一般都是主執行緒,你后面tomcat請求的執行緒獲取不到值很正常,不知道你具體要干啥,但是可以初始化賦值
public static ThreadLocal<String> username = new ThreadLocal<String>(){
@Override
protected String initialValue() {
return "aaa";
}
};
public static ThreadLocal<String> username2 = ThreadLocal.withInitial(()-> "aaa");
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247005.html
標籤:Java EE
