執行緒區域性變數的使用ThreadLocal和其底層原理
/*ThreadLocal類: * 該類提供了執行緒區域性變數,它是一個池 Map<Thread.currentThread,locObj>, * 池中為每個執行緒儲存一個獨立的區域性變數, * 每個執行緒可以從這個池中讀取或設定自己的區域性變數。
//底層就是一個map,用執行緒中的Thread.currentThread()作為識別的key,當前執行緒是一樣的則拿到的value也是相同的。
所以可以跨類使用該變數,長使用在資料庫連線池中方便事務的處理,讓在不同dao中處理的事務可以共享一個Connection,做到事務的一致性 */ public class ThreadLocalDemo { //執行緒區域性變數池 //private static ThreadLocal<Object> t = new ThreadLocal<Object>(); private static MyThreadLocal<Object> t = new MyThreadLocal<Object>(); public static Object getValue(){ //System.out.println(Thread.currentThread()); Object obj = t.get(); if(obj==null){ System.out.println("沒有...."); Random r = new Random(); obj = r.nextInt(100); t.set(obj); } return obj; } }
////////////////////////////////////////////////////////////////////////////////////自己做一個ThreadLocal的主要功能的類////////////////////////////////
//底層就是一個map,用執行緒中的Thread.currentThread()作為識別的key,當前執行緒是一樣的則拿到的value也是相同的。 public class MyThreadLocal<T> { private Map<Thread, Object> map = new HashMap<Thread, Object>(); public Object get(){ Thread curThread = Thread.currentThread(); return map.get(curThread); } public void set(Object obj){ Thread curThread = Thread.currentThread(); map.put(curThread, obj); } }