java synchronized實現機制

看了一些不錯書和文章後,整理了一幅圖,用來描述jvm是如何實現synchronized關鍵字的linux

其中補充幾點:安全

  1. jvm從偏向鎖->輕量級鎖->重量級鎖,是鎖升級過程,反之是鎖降級
  2. synchronized須要用到monitor對象,也就是synchronized(obj)中的obj對象,jvm會在這個對象的頭信息中進行cas操做,來標記該monitor對象的鎖類型(偏向、輕量級、重量級)、持有該monitor的threadId、被持有的計數等信息
  3. 因爲jvm都是基於thread來判斷該monitor是否可用,因此同一個thread能夠屢次加鎖該monitor對象,也就是jvm支持可重入鎖。後面每次重入,計數+1
  4. 在線程N進入全局安全點時,須要暫停持有偏向鎖的線程M,並檢查M是否存活,而後決策是升級鎖仍是降級鎖,避免M在執行同步塊的時候,N將鎖降級爲無鎖,致使N和M同時執行同步塊
  5. 第一個線程A獲取到偏向鎖,第二個線程B發現有人持有鎖,會將鎖降級爲輕量級鎖,第三線程發現B諮詢等待輕量級鎖,就會將鎖降級爲重量級鎖
  6. 當有多個線程頻繁競爭鎖時,禁用偏向鎖能夠優化性能
  7. 減小持有鎖的時間。長時間持有鎖,容易致使鎖降級爲重量級鎖
  8. 重量級鎖利用了操做系統的互斥鎖,須要從用戶態到內核態進行切換,開銷較大
  9. jvm線程與linux內核線程一一對應
相關文章
相關標籤/搜索