日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )

發布時間:2025/6/17 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、悲觀鎖
  • 二、樂觀鎖
  • 三、樂觀鎖 CAS 三大問題





一、悲觀鎖



假設有 222 個線程 , 線程 A 和 線程 B ; 線程 A 訪問共享資源 , 線程 B 等待 , 一旦線程 A 訪問結束 , 線程 B 訪問該共享資源 ;


悲觀鎖 : 只要有 線程 來操作 共享資源 , 就認為肯定 有其它若干線程也要操作該共享資源 , 一定要 對共享資源進行加鎖 ; 任何情況下 , 哪怕 只有一個線程訪問共享資源 , 也要對該共享資源進行加鎖 ; ( 持有悲觀的態度 )

對共享資源加鎖 , 會對該資源產生負面影響 , 效率會降低 ;

如果只是 單線程訪問資源 , 不會產生并發問題 , 沒有必要進行加鎖 ; 如果加了鎖 , 執行效率變低 , 造成了資源浪費 ;


synchronized 就是悲觀鎖 ;





二、樂觀鎖



樂觀鎖 : 持有樂觀的態度 , 線程 A 訪問共享資源 , 樂觀的認為只有 111 個線程訪問該資源 , 不用進行加鎖 ;


線程 A 訪問主內存變量前 , 記錄下值 XXX , 線程 A 訪問完畢后 , 會將最終的值同步到主內存中 , 此時會檢查下 主內存中變量的值是否還是 XXX ,

  • 如果是 , 則說明 線程 A 訪問期間 沒有線程修改該變量值 , 那么將線程 A 計算的 新值更新到主內存中
  • 如果不是 , 主內存中的變量值變成了 YYY , 那么說明該值 被其它線程修改了 ; 那么將當前值拋棄 , 重新從主內存獲取變量值 YYY , 然后線程 A 繼續執行 , 執行完畢后將計算結果同步到主內存變量中 , 再次對比主內存中的變量值是否是 YYY , 如果是可以更新 , 如果不是 , 那么再次重復本操作 ;

樂觀鎖 , 全程沒有加鎖 , 沒有阻塞 , 只要判定主內存中被訪問的共享變量 , 線程計算之前的值與計算之后的值一致 , 就更新到主線程中 ;





三、樂觀鎖 CAS 三大問題



CAS : Compare and Swap , 比較再交換 , 是樂觀鎖中的線程訪問完共享變量后 , 先進行變量比較 , 然后在同步共享變量值 ;


JDK 1.51.51.5 之后提供的 java.util.concurrent 包中的類 , 解決了 CAS 相關問題 ;

java.util.concurrent 包簡稱 J.U.C ;


CAS 解決的 333 大問題 :

ABA 問題 :

  • 問題描述 : 線程 A 訪問變量 X = 0 , 訪問期間 , 線程 B 訪問 X 將其改為 1 , 然后 線程 C 訪問 X 將其又改為 0 , 此時線程 A 訪問完畢后 , 查詢發現變量 X 仍然是 0 , 認為期間沒有線程訪問該變量 ;
  • 解決方案 : 給變量設置一個版本號 , 每次線程訪問變量時 , 版本號 +1 , 這樣每次判斷變量的版本號即可 ;

循環時間過長 :

  • 問題描述 : 樂觀鎖中 , 假如連續多次寫回數據時 , 發現值改變 , 校驗失敗 , 導致 重復執行線程代碼 , 會給 CPU 帶來很大開銷 , 這些 CPU 時間片都浪費了 ;
  • 解決方案 : 將鎖升級 ;

保證多個共享變量原子性問題 :

  • 問題描述 : 針對 單個共享變量 訪問時 , 使用 atomic 原子類 可以使用 CAS 保證原子操作 , 如果 有多個共享變量 , CAS 無法保證操作的原子性 ;
  • 解決方案 : 使用 JDK 提供的 AtomicReference 封裝多個變量到一個類對象中 , 保證共享變量的原子性 ;

線程 A 訪問共享變量的操作 , 不是原子操作 , 就會導致如下問題 :

線程 A 訪問變量 X , 執行完畢后 , 變量 X 值原始值進行比較 , 比較相等 , 將數據更新到主內存 , 如果在 比較相等后 , 在 數據更新到主內存之前 , 有 另外一個線程 B 修改了該變量 X , 這樣就出現了問題 ;

總結

以上是生活随笔為你收集整理的【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。