1. 程式人生 > >ThreadLocal 在連線池的應用

ThreadLocal 在連線池的應用

public class ManagerThreadLocal {

private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

//得到一個連線
public static Connection getConnection(){
Connection conn = tl.get();//從當前執行緒中取出一個連線
if(conn==null){
conn = C3P0Util.getConnection();//從池中取出一個
tl.set(conn);//把conn物件放入到當前執行緒物件中
}
return conn;
}

//開始事務
public static void startTransacation(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);//從當前執行緒物件中取出的連線,並開始事務
} catch (SQLException e) {
e.printStackTrace();
}
}

public static void commit(){
try {
getConnection().commit();//提交事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback(){
try {
getConnection().rollback();//回滾事務
} catch (SQLException e) {
e.printStackTrace();
}
}

public static void close(){
try {
getConnection().close();//把連線放回池中
tl.remove();//把當前執行緒物件中的conn移除
} catch (SQLException e) {
e.printStackTrace();
}
}

}

ThreadLocal為解決多執行緒程式的併發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多執行緒程式。當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每一個執行緒都可以獨立地改變自己的副本,而不會影響其它執行緒所對應的副本。

ThreadLocal類介面很簡單,只有4個方法,我們先來了解一下:

  • void set(Object value)設定當前執行緒的執行緒區域性變數的值。
  • public Object get()該方法返回當前執行緒所對應的執行緒區域性變數。
  • public void remove()將當前執行緒區域性變數的值刪除,目的是為了減少記憶體的佔用,該方法是JDK 5.0新增的方法。需要指出的是,當執行緒結束後,對應該執行緒的區域性變數將自動被垃圾回收,所以顯式呼叫該方法清除執行緒的區域性變數並不是必須的操作,但它可以加快記憶體回收的速度。
  • protected Object initialValue()返回該執行緒區域性變數的初始值,該方法是一個protected的方法,顯然是為了讓子類覆蓋而設計的。這個方法是一個延遲呼叫方法,線上程第1次呼叫get()或set(Object)時才執行,並且僅執行1次。ThreadLocal中的預設實現直接返回一個null。