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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java的悲观锁和乐观锁

發布時間:2024/3/24 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java的悲观锁和乐观锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?一、悲觀鎖的代表是 synchronized 和 Lock

????????①其核心思想是線程只有占有了鎖,才能去操作共享變量,每次只有一個線程占鎖成功,獲取鎖失敗的線程,都得停下來等待

????????②線程從運行到阻塞、再從阻塞到喚醒,涉及線程上下文切換,如果頻繁發生,影響性能

????????③實際上,線程在獲取 synchronized Lock 鎖時,如果鎖已被占用,都會做幾次重試操作,減少阻塞的機會

二、樂觀鎖的代表是 AtomicInteger,使用 cas 來保證原子性

????????①其核心思想是無需加鎖,每次只有一個線程能成功修改共享變量,其它失敗的線程不需要停止,不斷重試直至成功

????????②由于線程一直運行,不需要阻塞,因此不涉及線程上下文切換

????????③它需要多核 cpu 支持,且線程數不應超過 cpu 核數

三、樂觀鎖代碼演示

? ? ? ? 樂觀鎖的代碼是AtomicInteger,他的底層是Unsafe,他保證修改變量的時候是一個原子操作,我們現在想修改Account中的共享變量,修改之前我們要知道修改的成員變量的偏移位置,我們通過Unsafe對象里面一個方法,參數是修改的類型,變量名。

調用Unsafe的compareAndSetInt方法,修改之前會把當前的舊值跟共享變量最新值比較,如果沒變,則修改成功。我們用debug創建一個線程修改掉他的值,相加操作無法成功,我們可以通過循環來保證這個原子操作的成功。細節:共享變量一定要volatile來修飾,保證它的可見性。

?

?四、悲觀鎖和樂觀鎖解決線程安全問題

?這邊特意把相加相減操作分為三行代碼,檢查是否出現代碼指令交錯問題。debug加斷點,發現是不會出現指令交錯,sychronized只允許一個線程拿到鎖

????????樂觀鎖是通過循環不斷重試,樂觀鎖因為沒有加鎖,通過debug斷點測試,發現會出現指令交錯問題。但是沒有關系,因為樂觀鎖會比對最新值,不會出現共享變量出錯問題。

?

?

總結

以上是生活随笔為你收集整理的java的悲观锁和乐观锁的全部內容,希望文章能夠幫你解決所遇到的問題。

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