ThreadLocal工做原理

一、Thread類中有一個成員變量屬於ThreadLocalMap類(一個定義在ThreadLocal類中的內部類),它是一個Map,他的key是ThreadLocal實例對象。 二、當爲ThreadLocal類的對象set值時,首先得到當前線程的ThreadLocalMap類屬性,而後以ThreadLocal類的對象爲key,設定value。get值時則相似。 三、ThreadLocal變量的活動範圍爲某線程,是該線程「專有的,獨自霸佔」的,對該變量的全部操做均由該線程完成!也就是說,ThreadLocal 不是用來解決共享對象的多線程訪問的競爭問題的,由於ThreadLocal.set() 到線程中的對象是該線程本身使用的對象,其餘線程是不須要訪問的,也訪問不到的。當線程終止後,這些值會做爲垃圾回收。 四、由ThreadLocal的工做原理決定了:每一個線程獨自擁有一個變量,並不是是共享的。緩存

介紹一下Java四種引用包括強引用,軟引用,弱引用,虛引用。多線程

強引用:編碼

只要引用存在,垃圾回收器永遠不會回收 Object obj = new Object(); //可直接經過obj取得對應的對象 如obj.equels(new Object()); 而這樣 obj對象對後面new Object的一個強引用,只有當obj這個引用被釋放以後,對象纔會被釋放掉,這也是咱們常常所用到的編碼形式。線程

軟引用:對象

非必須引用,內存溢出以前進行回收,能夠經過如下代碼實現 Object obj = new Object(); SoftReference<Object> sf = new SoftReference<Object>(obj); obj = null; sf.get();//有時候會返回null 這時候sf是對obj的一個軟引用,經過sf.get()方法能夠取到這個對象,固然,當這個對象被標記爲須要回收的對象時,則返回null; 軟引用主要用戶實現相似緩存的功能,在內存足夠的狀況下直接經過軟引用取值,無需從繁忙的真實來源查詢數據,提高速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。內存

弱引用:get

第二次垃圾回收時回收,能夠經過以下代碼實現 Object obj = new Object(); WeakReference<Object> wf = new WeakReference<Object>(obj); obj = null; wf.get();//有時候會返回null wf.isEnQueued();//返回是否被垃圾回收器標記爲即將回收的垃圾 弱引用是在第二次垃圾回收時回收,短期內經過弱引用取對應的數據,能夠取到,當執行過第二次垃圾回收時,將返回null。 弱引用主要用於監控對象是否已經被垃圾回收器標記爲即將回收的垃圾,能夠經過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。監控

虛引用:變量

垃圾回收時回收,沒法經過引用取到對象值,能夠經過以下代碼實現 Object obj = new Object(); PhantomReference<Object> pf = new PhantomReference<Object>(obj); obj=null; pf.get();//永遠返回null pf.isEnQueued();//返回是否從內存中已經刪除 虛引用是每次垃圾回收的時候都會被回收,經過虛引用的get方法永遠獲取到的數據爲null,所以也被成爲幽靈引用。 虛引用主要用於檢測對象是否已經從內存中刪除。原理

相關文章
相關標籤/搜索