相同:ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。
不同:Synchronized同步機制采用了“以時間換空間”的方式,僅提供一份變量,讓不同的線程排隊訪問;而ThreadLocal采用了“以空間換時間”的方式,每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
以時間換空間->即枷鎖方式,某個區域代碼或變量只有一份節省了內存,但是會形成很多線程等待現象,因此浪費了時間而節省了空間。
以空間換時間->為每一個線程提供一份變量,多開銷一些內存,但是呢線程不用等待,可以一起執行而相互之間沒有影響。
小結:ThreadLocal是解決線程安全問題一個很好的思路,它通過為每個線程提供一個獨立的變量副本解決了變量並發訪問的沖突問題。在很多情況下,ThreadLocal比直接使用synchronized同步機制解決線程安全問題更簡單,更方便,且結果程序擁有更高的並發性。

1 public class ConnectionUtil { 2 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); 3 private static Connection initConn = null; 4 static { 5 try { 6 initConn = DriverManager.getConnection("url, name and password"); 7 } catch (SQLException e) { 8 e.printStackTrace(); 9 } 10 } 11 12 public Connection getConn() { 13 Connection c = tl.get(); 14 if(null == c) tl.set(initConn); 15 return tl.get(); 16 } 17 }

1 public class ConnectionUtil { 2 private static DBOPool instance=null; 3 public static synchronized Connection getInstance(){ 4 if(instance==null) 5 instance=new DBOPool(); 6 return instance.getConnection(); 7 } 8 }