首先有幾點需要大家清楚的: 1、
threadlocal
只是對需要儲存的物件的管理,而儲存實際是由當前thread
負責。個人理解為threadlocal
是乙個操作thread. threadlocals
的工具。 2、
使用threadlocal
可以使物件達到執行緒隔離的目的。同乙個threadlocal
操作不同的thread
,實質是各個thread
對自己的變數操作。 3、
為什麼要使用threadlocal
,個人感覺有兩個原因,1
是與其它執行緒的隔離,2
是可以在乙個執行緒的生命週期中使用同乙個物件,達到物件傳遞的作用。這樣的好處是可以減少dal
訪問或者ws
呼叫。
我這裡列出乙個用到threadlocal
的例子,主要的作用是使用threadlocal
記錄使用者資訊以及記錄使用者的執行時間。這在實際應用中,可以對映為全域性記錄使用者的許可權,以及使用threadlocal
對系統的效能做一些分析等。。
首先有兩個物件,乙個是使用者物件
另乙個是消費時間物件// 簡單記錄使用者是否可以訪問,可以用於全域性許可權控制等
class user
public string getname()
public boolean isallow()
@override
public string tostring()
}
// 用於記錄每一步驟耗時…,可以用於每一步的效能分析
class timeconsumer
public void andstep(long step)
@override
public string tostring()
return br.tostring();
}}
接下來,建立乙個對這兩個物件管理的threadlocal
的類
// threadlocal 管理類
class mythreadlocal
public static mythreadlocal getinstanse()
public void adduser(user user)
public user getuser()
public void addtime(timeconsumer timeconsumer)
public void addtime(long l)
public timeconsumer gettime()
}
接下來就可以對threadlocal
進行測試了。為了模擬多執行緒,我這裡自己實現了多執行緒
public class corethreadlocal
}// 用於測試,多執行緒實現
class testrunnable implements runnable
public void run()
// 模擬具體業務的處理步驟
private void dothings(long l) catch (interruptedexception e)
}}
執行上面的程式得到結果如下:
使用者名稱:name2 是否允許訪問:true
操作[name2]共有2步
|--耗時[703ms]
|--耗時[1406ms]
使用者名稱:name3 是否允許訪問:false
操作[name3]共有2步
|--耗時[891ms]
|--耗時[1781ms]
使用者名稱:name1 是否允許訪問:true
操作[name1]共有2步
|--耗時[1000ms]
|--耗時[2000ms]
通過上面的測試程式,可以大概了解threadlocal
的使用方法以及作用。
如果要深入使用,建議還是看下原始碼吧…
ThreadLocal介紹及其原理
threadlocal可以設定儲存屬於當前執行緒的物件,存在當前執行緒 currentthread 的threadlocals中,threadlocals是threadlocalmap類的物件。threadlocal的作用 儲存單個執行緒上下文資訊。比如儲存id等 減少引數傳遞。比如做乙個trace...
ThreadLocal使用案例
本文藉由併發環境下使用執行緒不安全的 dateformat優化案例,幫助大家理解threadlocal.public class dateutil catch parseexception e 首先分析下 該處的函式parseymdhms 使用了synchronized修飾,意味著該操作是執行緒不安...
Java事務 三 使用ThreadLocal
一.為什麼使用threadlocal 如果涉及到呼叫多個service,那我是不是還得從controller層傳遞connection?從而不會影響其他執行緒中的例項變數,所以threadlocal可以實現執行緒範圍內資料共享。二.如何使用threadlocal 1.寫乙個transactionma...