一文理解synchronized

  • synchronized 作爲java中最早提供的同步鎖解決方式,一直伴隨着java的發展不斷在優化。synchronized是如何優化的呢?
  • synchronized 通過鎖的升級降級實現鎖的優化。synchronized升級鎖由低到高爲:偏斜鎖 - 輕量級鎖-重量級鎖。鎖的升級導致的是性能主鍵降低,越來越重。
  • 偏斜鎖:這是一種非常高效的鎖,默認在沒有競爭的情況下使用,即被鎖對象生命週期內只被一個線程持有,沒有另外的線程試圖獲取此對象。當一個線程持有一個對象的偏斜鎖時,會在對象頭加上一個線程id去標識。當另一個線程試圖獲取已經持有偏斜鎖的對象時,那麼鎖升級爲輕量級鎖。
  • 輕量級鎖:輕量級鎖即通過CAS能夠獲取到鎖,那麼該鎖就獲取成功,成爲一個持有輕量級鎖的對象。如果通過CAS獲取失敗,則鎖升級爲重量級鎖。
  • 重量級鎖:這是使用同步機制進行鎖定,當有另外的線程需要獲取此時被鎖定的重量級鎖時,只能等待鎖釋放。同一時刻只有一個線程可以持有該對象鎖,執行該對象的同步方法。這時稱之爲對象鎖。
  • 如果在類上加鎖,則持有的鎖時類對象鎖。那麼同一時刻只有一個持有類對象鎖的線程才能執行該類的所有方法。這就像是一個大箱子,類鎖時大箱子上上鎖,所以沒有持有鎖的線程對所有該箱子裏的方法都不能執行。而對象鎖就是一個大箱子裏的小箱子,小箱子裏鎖住了該對象的同步方法,那麼別的線程依然可以執行該對象的非同步方法,因爲沒有被鎖。
  • 當然如果new 了一個新對象,則線程重新競爭,獲得該對象鎖的方法執行其同步方法,其他需要執行對象的同步方法的線程則等待執行。
  • 鎖的降級認爲是發生在jvm的安全點之上,在安全點檢測monitor。synchronized的實現是在jvm裏實現的,通過monitorenter 進入鎖,monitorexit 退出鎖。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章