Java多線程⑤----併發知識點筆記

多線程文章目錄

下面這部分知識在面試中可能會用到,同時瞭解這些只有有助於我們寫出高併發的代碼;同時歡迎和我探討。

我只是簡單的列出部分知識和概念,詳細情況可以讀我放出的博客鏈接。

對象內存佈局

https://www.cnblogs.com/zhengbin/p/6490953.html

包括三部分:對象頭、實例數據和對齊填充

對象頭: 總共佔12個字節,前8個字節是mark world (0-4 4-8) ;哈希碼(HashCode)、GC 分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程 ID、偏向時間戳、對象分代年齡

後4個字節,是指向class的指針;64位實際上佔用8字節,但是默認啓用指針壓縮;

12個字節不滿足8的倍數、對齊補充4個字節

 

逃逸分析 --編譯器JIT

https://blog.csdn.net/w372426096/article/details/80938788

同步關鍵字 synchonized

cas lock cmpxchg

https://www.cnblogs.com/ljl150/p/12514198.html

1、字節碼層面 monitorenter moniterexit

2、jvm執行過程中 偏向鎖(無鎖)----> 自旋鎖(cas) ----> 重量鎖(互斥信號)

自旋更新鎖記錄Lock Record採用cas方式;1.6以後加入自適應自旋鎖

3、彙編層(cpu指令)實現 lock cmpxchg

訪問大對象,超過64kb的,鎖總線,效率低;不然使用cpu的一致性實現、如MESI;

https://blog.csdn.net/qq_35642036/article/details/82801708 總線鎖、緩存是、MESI

重量鎖 涉及到內核態到用戶態的切換;鎖記錄指向互斥量 lock mutex

依賴於底層的操作系統的Mutex Lock;而操作系統實現線程之間的切換時需要從用戶態轉換到內核態,這個狀態之間的轉換需要相對比較長的時間,時間成本相對較高,這也是爲什麼早期的synchronized效率低的原因

wait/notify必須在同步代碼塊中執行,用於生成monitorenter 和 monitorexit指令

 

關鍵字Voliatile

1、線程可見性

2、指令重排序 ---cpu亂序執行

1、驗證代碼

2、DCL(雙重檢查問題)問題、半初始化對象、使用對象出現問題

指令重排原理:

1、voliatlie可見性

2、JVM層面內存屏障,相關規範

3、CPU層面lock、鎖總線(有相關指令操作,考慮一致性問題和同步一樣用鎖)

 

Java引用

http://blog.csdn.net/l540675759/article/details/73733763 參考博客

強引用  正常的new對象

軟引用  SoftReference 內存不足就回收;應用場景 緩存

和引用隊列一起使用,如果被回收會放到引用隊列,被感知

#舉例,除了虛引用都是類似的用法
SoftReference reference = new SoftReference(obj, queue);

弱引用 WeakReference 弱引用的對象擁有更短的生命週期,只要垃圾回收器掃描到它,不管內存空間充足與否,都會回收它的內存。

一次性場景:ThreadLocal場景;Spring transaction的connnection;

同樣可以和引用隊列一起使用

虛引用 PhantomReference;堆外內存標記方便回收 應用場景 堆外內存;NIO

必須和引用隊列關聯 :

當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之關聯的引用隊列中。

(1)單條引用路徑可及性判斷:
在這條路徑中,最弱的一個引用決定對象的可及性。
(2)多條引用路徑可及性判斷:
幾條路徑中,最強的一條的引用決定對象的可及性    

 

ThreadLocal

https://www.jianshu.com/p/a1cd61fa22da

1、主線程 threadLocal、線程1使用threadLocal添加值,實際上添加到當前線程的ThreadLocal.ThreadLocalMap裏面;線程2亦如是;

2、ThreadLocal使用entry使用弱引用存放key(即ThreadLocal),使用弱引用,方便gc回收ThreadLocal對象,不然無法回收,內存泄漏;但是map中的value對象依然無法釋放,會有內存泄漏;使用後,記得reomve key不然會有內存泄漏,remove會將key值爲空的也刪掉

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
//ThreadLocal<?> key, Object value

應用場景:Spring transaction的connnection;;WeakHashMap

在Java集合中有一種特殊的Map類型即WeakHashMap,在這種Map中存放了鍵對象的弱引用,當一個鍵對象被垃圾回收器回收時,那麼相應的值對象的引用會從Map中刪除. WeakHashMap能夠節約儲存空間,可用來緩存那些非必須存在的數據. WeakHashMap的訪問操作這時候才進行對鍵對象的垃圾回收清理.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章