一、基礎概念
1、重進入
當一個線程請求已被其他線程占有的鎖時,請求線程會被阻塞。
但當一個線程請求被自己占有的鎖時,請求會成功。即可重進入
2、volatile和鎖
鎖可以保證可見性和原子性;
volatile只能保證可見性;
四大屏障;
3、CAS
3.1 CAS并發原語體現在Java中就是sun.misc.Unsafe類的各個方法。調用Unsafe中的CAS方法,JVM會幫我們實現出CAS匯編指令。這是一種完全依賴于硬件的功能,通過它實現了原子操作。
由于CAS是一種系統原語,原語的執行必須是連續的,且不允許中斷,也就是說CAS是一條CPU的原子指令,不會造成數據不一致的問題。
3.2 原子引用 AtomicReference

3.3 手寫自旋鎖


3.4 CAS缺點
1、循環時間長開銷大
2、ABA問題----AtomicStampedReference
4、Monitor
hotspot中,monitor采用ObjectMonitor實現。
每一個對象都天生帶著ObjectMonitor,每一個被鎖住的對象都會和Monitor關聯起來


5、原子類
1、分類:基本原子類、數組原子類、
引用原子類:AtomicReference,AtomicStampedReference,AtomicMarkableReference
原子更新對象屬性:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater

必須使用int類型,否則報錯


AtomicReferenceFieldUpdater


2、LongAdder和LongAccumulator
LongAdder比AtomicLong在大吞吐量時性能顯著,減少樂觀鎖次數;
LongAdder只適用于累加,只能從0開始;

LongAdder 繼承 Striped64 繼承 Number

LongAdder總體思想:分散熱點,將value值分散到一個Cell數組中,不同線程會命中到數組的不同槽中,各個線程只對自己槽中的值進行CAS操作。如果要獲取真正的Long值,只需將各個槽中的值累加返回。
初始化cell數組:

擴容

6、ThreadLocal
6.1 初步解釋
ThreadLocal提供線程局部變量,這些變量與正常的變量不同,因為每一個線程在訪問ThreadLocal實例的時候,都有自己的、獨立初始化的變量副本。ThreadLocal實例通常是類中的私有靜態字段,使用他的目的是希望將狀態與線程關聯起來
6.2 使用注意
使用完成后調用remove(),刪除此線程局部變量的當前線程值。
6.3 源碼分析
1、Thread,ThreadLocal,ThreadLocalMap的關系

2、get方法
首先獲取當前線程的成員變量threadLocals,即一個ThreadLocalMap,若map為null,則進行初始化;
初始化的過程,即創建一個ThreadLocalMap,賦值給當前線程的threadLocals。

6.4 內存泄漏問題
1、內存泄漏:不再會被使用的對象或變量占用的內存不能被回收
2、強引用(Reference):對于強引用對象,就算出現了OOM,也不會對該對象進行回收
強引用是我們最常見的普通對象引用。
3、軟引用(SoftReference):對于只有軟引用的對象,當系統內存充足時不會回收,系統內存不足時會回收。
4、弱引用(WeakReference):對于只有弱引用的對象,只要垃圾回收器一運行,不管jvm的內存是否足夠,都會被回收。
5、虛引用(PhantomReference):
虛引用形同虛設,如果一個對象僅持有虛引用,那么它和沒有任何引用一樣,在任何時候都可能被回收,不能單獨使用也不能通過它訪問對象,虛引用必須和引用隊列(ReferenceQueue)結合使用。被回收后會放到引用隊列中,可以執行后續的操作,如事后清理操作。
虛引用的主要作用是跟蹤對象被垃圾回收的狀態,僅僅只是提供了一種確保對象被finalize后,做某些事情的通知機制。get方法總是返回null

6、為什么用弱引用
如上圖所示,因ThreadLocalMap中存放的當前ThreadLocal的引用,而ThreadLocalMap是Thread的成員變量,當棧幀中的強引用取消時,弱引用可被回收,可大大減小內存泄漏的防線。
7、總結

7、對象內存布局
1、對象內存布局初識
對象在堆內存中的存儲布局可以劃分為三個部分:對象頭、實例數據、對齊填充(整體保證大小為8個字節的倍數)
對象頭:對象標記(Mark Word),類元信息(又叫類型指針)

2、對象頭-MarkWord
包含哈希碼(如obj.hashcode()),GC標記,GC次數,同步鎖標記,偏向鎖持有者等,默認存儲HashCode,分代年齡和鎖標志位等信息。
64位系統中,MarkWord占8字節
3、對象頭-類元信息(類型指針)
每次new對象時的模板,指向方法區的類元信息
64位系統中,類元信息占8個字節
4、實例數據
浙公網安備 33010602011771號