開發者學堂課程【Java 面試疑難點串講1:面試技巧及語言基礎:this 關鍵字】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/24/detail/494ThreadLocal
内容介紹
一、ThreadLocal
在整個 Java 之中引用傳遞是一個核心的問題,也就是說幾乎所有的問題都可能卡在引用傳遞上。
例如:反射機制裡面如果采用反射進行對象執行個體化,則要求類中要提供有無參構造方法。
如果你沒有無參構造,那麼就必須明确的傳遞一個參數(可能是各種類型)。你不得不去面對 Constructor 的操作形式。
範例:問題引出
class Message { //
簡單Java類,本質在于進行資料的包裝
private String info ;
public Message(String info) {
this.info = info ;
}
public String getInfo() {
return info;
}
}
class Send {
public void set(Message msg) { //
基礎的引用傳遞
System.out.println(msg.getInfo());
}
}
public class TestDemo {
public static void main(String[] args) {
Message temp = new Message("
您吃了麼?") ;
new Send( ).set(temp);
}
}
整個過程之中屬于一個最基礎的引用傳遞。但是一個新的思考出現了。要求 Send 類中的 set() 方法裡面不接收 Message 類對象,但是還要求可以傳遞 Message 。
于是有人想到,采用一個中間過渡處理,設定一個 static 屬性操作。
class Message { //
簡單Java類,本質在于進行資料的包裝
private String info ;
public Message(String info) {
this.info = info ;
}
public String getInfo( ) {
return info;
}
class Send {
public void set() { //
基礎的引用傳遞
Message msg = Factory.message ; //
對象怎麼來的自己想System.out.println(msg.getInfo());
}
class Factory {
public static Message message ;
public class TestDemo {
public static void main(String[] args) {
Message temp = new Message("
您吃了麼?") ;//準備對象Factory.message = temp ;
new Send().set(); //
發送
}
但是現在一個問題: java 是多線程了, static 儲存的是全局資料區,屬于公共的資料處理。但是這種操作在多線程進行中就會出現資料不同步的問題了。那麼最好的做法是在可以儲存資料基礎上再多儲存一個目前線程對象。
而這種操作就屬于 ThreadLocal 類的作用,也就是說 ThreadLocal 在每一次設定内容的時候都會儲存有一個目前的線程對象。
在 ThreadLocal 的操作裡面在開發之中儲存最多的往往是資料庫的連接配接對象,因為在幾乎業務層、資料層也好都可能使用到這種資料庫的連接配接對象,是以将這種對象儲存在 ThreadLocal 裡面是最合适的。