1. 程式人生 > >聊聊java 中的偏向鎖、輕量級鎖、重量級鎖的介紹

聊聊java 中的偏向鎖、輕量級鎖、重量級鎖的介紹

重量級鎖:即為傳統鎖,是通過互斥量來實現程式碼同步,但是互斥量相對於CAS(原子性操作),要產生更多的效能消耗。

輕量級鎖:輕量級鎖是通過CAS來實現同步,相對重量級鎖的互斥量,效能會好很多。但是輕量級鎖不是為了替代重量級鎖。

                    輕量級鎖能夠提升程式同步新能的依據是:對於絕大多數的鎖,在整個同步週期內都是不存在競爭的,這是一個經驗資料。

                    如果沒有競爭,輕量級鎖使用CAS操作避免了使用互斥量的開銷。但如果存在鎖競爭,則輕量級鎖會在CAS操作外,還使用了互斥量,                      效能反而下降。

偏向鎖:偏向鎖能提高程式同步效能的場景是:有同步程式碼,但是隻有同一個執行緒執行該同步程式碼塊(注意和輕量級鎖的應用場景的區別)。在這種                 場景下,連CAS操作也不需要了。

總結:當多執行緒環境下,同步程式碼塊經常由同一個執行緒訪問,那麼偏向鎖將能提升效能;當同步程式碼塊經常被多個執行緒訪問,但是不存在併發情況,那麼輕量級鎖能夠帶來程式效能的提升;如果同步程式碼塊不但被多個執行緒訪問,並且發生併發情況,那麼輕量級鎖反而造成效能下降,不如使用重量級鎖。

這些性質都是java內建鎖sychronized的特性,java5引進的Lock庫不具備。所以經常能在書中看到,一半情況下推薦使用synchronized,因為將來jvm可能會對內建鎖進行優化。

推薦資料:

《深入理解java虛擬機器——JVM高階特性與最佳實踐》

https://www.cnblogs.com/charlesblc/p/5994162.html