前言
高效并發(fā)是從JDK1.5到JDK1.6的一個重要改進,Java開發(fā)者團隊在這個版本上花費了大量的精力去實現(xiàn)各種鎖優(yōu)化技術(shù),如適應(yīng)性自旋、鎖消除、鎖粗化、輕量級鎖和偏向鎖等。這些技術(shù)都是為了在線程之間更高效地共享數(shù)據(jù),以及解決競爭問題,從而提高程序的執(zhí)行效率。
自旋鎖與自適應(yīng)自旋
互斥同步中,對性能最大的影響是阻塞的實現(xiàn):掛起線程和恢復(fù)線程的操作都需要轉(zhuǎn)入內(nèi)核態(tài)去完成,這些操作給系統(tǒng)的并發(fā)性帶來了很大的壓力。為此我們設(shè)置了自旋鎖,讓線程執(zhí)行一個忙循環(huán)(等待)。
自旋鎖的評估
自旋鎖本身雖然避免了線程切換的開銷,但它是要占用處理器的時間。因此,如果鎖被占有的時間很短,自旋等待的效果會非常好;反之,如果鎖被占有的時間很長,那么自旋的線程只會白白浪費處理器資源。因此,自旋等待的時間必須有一定的限度,如果超過了限定的次數(shù)仍然沒有成功獲得鎖,就應(yīng)當(dāng)使用傳統(tǒng)的方式掛起線程。自旋次數(shù)的默認(rèn)值為10,用戶可以通過使用參數(shù)-XX:PreBlockSpin來更改。
自適應(yīng)自旋鎖
自適應(yīng)意味著自旋的時間不再固定,而是由前一次在同一個鎖的自旋時間及鎖的擁有者的狀態(tài)來決定。如果在同一對象上,自旋等待剛剛成功獲得鎖,并且持有鎖的線程正在運行中,那么虛擬機就會認(rèn)為這次自旋也很有可能成功,進而它允許自旋等待持續(xù)相對較長時間。如果對于某個鎖,自旋很少成功,那么在以后獲取這個鎖時將可能省略掉自旋過程,以避免浪費處理器資源。
鎖消除
鎖消除是指虛擬機即時編譯器運行時,對一些代碼要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進行消除。