java的悲观锁和乐观锁
?一、悲觀鎖的代表是 synchronized 和 Lock 鎖
????????①其核心思想是【線程只有占有了鎖,才能去操作共享變量,每次只有一個線程占鎖成功,獲取鎖失敗的線程,都得停下來等待】
????????②線程從運行到阻塞、再從阻塞到喚醒,涉及線程上下文切換,如果頻繁發生,影響性能
????????③實際上,線程在獲取 synchronized 和 Lock 鎖時,如果鎖已被占用,都會做幾次重試操作,減少阻塞的機會
二、樂觀鎖的代表是 AtomicInteger,使用 cas 來保證原子性
????????①其核心思想是【無需加鎖,每次只有一個線程能成功修改共享變量,其它失敗的線程不需要停止,不斷重試直至成功】
????????②由于線程一直運行,不需要阻塞,因此不涉及線程上下文切換
????????③它需要多核 cpu 支持,且線程數不應超過 cpu 核數
三、樂觀鎖代碼演示
? ? ? ? 樂觀鎖的代碼是AtomicInteger,他的底層是Unsafe,他保證修改變量的時候是一個原子操作,我們現在想修改Account中的共享變量,修改之前我們要知道修改的成員變量的偏移位置,我們通過Unsafe對象里面一個方法,參數是修改的類型,變量名。
調用Unsafe的compareAndSetInt方法,修改之前會把當前的舊值跟共享變量最新值比較,如果沒變,則修改成功。我們用debug創建一個線程修改掉他的值,相加操作無法成功,我們可以通過循環來保證這個原子操作的成功。細節:共享變量一定要volatile來修飾,保證它的可見性。
?
?四、悲觀鎖和樂觀鎖解決線程安全問題
?這邊特意把相加相減操作分為三行代碼,檢查是否出現代碼指令交錯問題。debug加斷點,發現是不會出現指令交錯,sychronized只允許一個線程拿到鎖
????????樂觀鎖是通過循環不斷重試,樂觀鎖因為沒有加鎖,通過debug斷點測試,發現會出現指令交錯問題。但是沒有關系,因為樂觀鎖會比對最新值,不會出現共享變量出錯問題。
?
?
總結
以上是生活随笔為你收集整理的java的悲观锁和乐观锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea查看class文件显示 comp
- 下一篇: 11G重建scott