取經之路 & 關鍵字synchronized

取經之路

關鍵字synchronized

  • 使每個線程依次排隊操作共享變量 <效率低,但是基礎>

  • 原理

    • 場景
      • 方法
        • 實例方法 synchronized void func()
        • 靜態方法 (類方法)static synchronized void func()
      • 代碼塊
        • 實例對象synchronized(this)
        • 類對象synchronized(ClassA.class)
        • 具體對象``string lock = “”; synchronized(lock)`

    **自我理解: **

    靜態和實例的區別就是:

    • 靜態屬於這個類的所有實例的方法都會被鎖
    • 實例僅僅鎖住當前對象實例
  • 底層原理

  • 監聽器

    • 先獲取對象的監聽器monitor才能繼續執行
    • 同一時刻只用一個線程可以獲得對象的監聽器monitor <互斥>
    • 類對象的synchronized具有重入性,不需要再次獲得鎖
    • 每個對象都有監聽器,只有獲得監聽器才能繼續操作,否則線程等待阻塞
  • A happens-before B

    • A執行再B得前面
    • A得結果對B可見 <B讀取到的數據使A的值>
  • 獲取和釋放鎖的內存含義

  • 獲取鎖

    • 從主存中讀取數據到工作內存
  • 釋放鎖

    • 將工作內存中的最新之刷新到主存

自我理解

對象的監聽器和可見性

  • synchronized優化

悲觀鎖 很是悲觀,一開始就認爲自己有衝突,獲取鎖的時候阻塞其他線程獲取鎖

樂觀鎖愛笑的人運氣不會差,一開始認位沒有衝突,不會阻塞其他線程的操作

  • CAS 比較交換

    • 檢測線程是否出現衝突

    • VON操作

      • V 內存存放的實際值

      • O 舊的值

      • N 更新的值

        操作

        V ==O -> V=N

        V!=O -> return V

    • 缺點

      • ABA問題 解決方案:AtomicStampedReference Java1.5之後引入
      • 自旋時間過長
      • 只能保證一個共享變量的原子操作 解決方案: 常量類
  • Java對象頭

    • 組成
      • 鎖狀態
        • 無狀態
        • 偏向鎖
        • 輕量鎖
        • 重量鎖
      • 對象hashcode
      • 對象分代年齡
      • 是否偏向鎖
      • 鎖標記
    • 偏向鎖
      • 使獲得鎖的代價減少 <通過檢查對象頭,避免CAS操作>
      • 等到競爭出現的時候才釋放鎖
    • 輕量鎖
      • 執行代碼前再棧幀創建鎖記錄空間
      • 可升級爲重量鎖 <鎖可以升級不能降級>

筆記整理自網絡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章