1. 程式人生 > >執行緒區域性變數的使用ThreadLocal和其底層原理

執行緒區域性變數的使用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);     } }