鎖優化技術(HotSpot虛擬機而言)包括適應性自旋、鎖消除、鎖粗化、輕量級鎖和偏向鎖等。這些技術都是爲了在線程之間更高效地共享數據以及解決競爭問題,從而提升程序效率。數組
若是線程獲取不到鎖,第一時間不是去切換系統態進行等待,而是作一個循環操做,去等到鎖的釋放,循環到必定的次數終止循環,調入系統調用。爲了讓線程等待,而不是阻塞,讓線程執行一個忙循環(自旋),這就是自旋鎖。多線程
自旋鎖的優化主要是爲了減小了線程切換帶來的消耗。app
自旋鎖適合那些線程佔用鎖時間短的場景。性能
JDK1.6加入了自適應自旋鎖。顧名思義,若是在同一個鎖對象上,自旋等待剛剛成功得到過鎖,而且持有鎖的線程正在運行,那麼虛擬機就會認爲此次自旋也頗有可能再次成功,並將自旋等待時間延長。若是對於某個鎖,自旋不多成功,那麼在以後獲取該鎖時可能會放棄不自旋直接掛起線程。優化
指虛擬機即時編譯器在運行時,對一些代碼上要求同步,可是被檢測到不可能存在共享數據競爭時,把鎖進行消除。操作系統
鎖消除的主要判斷依據來源於逃逸分析的數據支持,若是判斷在一段代碼中,堆上的全部數據都不會逃逸出去從而被其餘線程訪問到,那就能夠把它們當作棧上數據對待,認爲它們是線程私有的,同步加鎖就無需進行。線程
若是一系列的連續動做都對同一對象反覆加鎖和解鎖,甚至加鎖操做時出如今循環體中的,那即便沒有線程競爭,頻繁地進行互斥同步操做也會致使沒必要要的性能損耗,好比連續的append()方法。指針
在說輕量級鎖和偏向鎖以前,咱們要先了解一下HotSpot虛擬機中對象的對象頭。對象
HotSpot虛擬機的對象頭分爲兩部分信息:編譯器
因此,咱們來看一下對象頭的Mark Word中的存儲內容有哪些?
存儲內容 | 標誌位 | 狀態 | 用處 |
對象哈希碼,對象分代年齡 | 01 | 未鎖定 | 狀態 |
指向鎖記錄的指針 | 00 | 輕量級鎖定 | 狀態 |
指向重量級鎖的指針 | 10 | 膨脹 | 狀態 |
空,不須要記錄信息 | 11 | GC標記 | 狀態 |
偏向線程ID,偏向時間戳、對象分代年齡 | 01 | 可偏向 | 狀態 |
什麼是CAS操做?
CAS是英文單詞CompareAndSwap的縮寫,中文意思是:比較並替換。簡單來講,CAS整個比較並替換的操做是一個原子操做。
他的意思是在沒有多線程競爭的前提下,減小傳統的重量級鎖使用操做系統互斥量產生的消耗
加鎖過程:
解鎖過程:
提高程序同步性能的依據是「對於絕大部分的鎖,在整個同步週期內都是不存在競爭的」。
若是沒有競爭,輕量級鎖使用CAS操做避免了使用互斥量的開銷。
但若是存在鎖競爭,除了互斥量的開銷外,還額外發生了CAS操做,所以在有競爭的狀況下,輕量級鎖會比傳統的重量級鎖更慢。
消除數據在無競爭狀況下的同步原語,進一步提升程序的運行性能。簡單來講就是**在無競爭的狀況下把整個同步都消除掉,連CAS操做都不作。**就是說當一個線程率先獲取到這個鎖後,若是該鎖沒有被其餘線程獲取,那麼持有偏向鎖的線程將永遠不須要同步。
能夠提升帶有同步但無競爭的程序性能
和輕量級鎖同樣,若是這個同步塊可能不少時候都是多個線程同時訪問的話,那麼偏向鎖甚至會增長時耗
JVM對鎖進行了優化,包括自旋鎖(自適應自旋鎖)、鎖粗化、輕量級鎖、偏向鎖。然後二者會由於競爭的多少而產生性能的變化。