最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的悲觀鎖與樂觀鎖是什么

 更新時間:2020年09月08日 12:01:41   作者:崔笑顏  
這篇文章主要介紹了Java中的悲觀鎖與樂觀鎖是什么,幫助大家更好的理解和學(xué)習(xí)Java鎖的相關(guān)知識,感興趣的朋友可以了解下

樂觀鎖對應(yīng)于生活中樂觀的人總是想著事情往好的方向發(fā)展,悲觀鎖對應(yīng)于生活中悲觀的人總是想著事情往壞的方向發(fā)展。這兩種人各有優(yōu)缺點(diǎn),不能不以場景而定說一種人好于另外一種人。

悲觀鎖

總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉(zhuǎn)讓給其它線程)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨(dú)占鎖就是悲觀鎖思想的實(shí)現(xiàn)。

樂觀鎖

總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號機(jī)制和CAS算法實(shí)現(xiàn)。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫提供的類似于write_condition機(jī)制,其實(shí)都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實(shí)現(xiàn)方式CAS實(shí)現(xiàn)的。

兩種鎖的使用場景

從上面對兩種鎖的介紹,我們知道兩種鎖各有優(yōu)缺點(diǎn),不可認(rèn)為一種好于另一種,像樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果是多寫的情況,一般會經(jīng)常產(chǎn)生沖突,這就會導(dǎo)致上層應(yīng)用會不斷的進(jìn)行retry,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適。

樂觀鎖常見的兩種實(shí)現(xiàn)方式 樂觀鎖一般會使用版本號機(jī)制或CAS算法實(shí)現(xiàn)。

版本號機(jī)制

一般是在數(shù)據(jù)表中加上一個數(shù)據(jù)版本號version字段,表示數(shù)據(jù)被修改的次數(shù),當(dāng)數(shù)據(jù)被修改時,version值會加一。當(dāng)線程A要更新數(shù)據(jù)值時,在讀取數(shù)據(jù)的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當(dāng)前數(shù)據(jù)庫中的version值相等時才更新,否則重試更新操作,直到更新成功。

舉一個簡單的例子: 假設(shè)數(shù)據(jù)庫中帳戶信息表中有一個 version 字段,當(dāng)前值為 1 ;而當(dāng)前帳戶余額字段( balance )為 $100 。

  1. 操作員 A 此時將其讀出( version=1 ),并從其帳戶余額中扣除 50(100-
  2. 在操作員 A 操作的過程中,操作員B 也讀入此用戶信息( version=1 ),并從其帳戶余額中扣除 20(100-
  3. 操作員 A 完成了修改工作,將數(shù)據(jù)版本號加一( version=2 ),連同帳戶扣除后余額( balance=$50 ),提交至數(shù)據(jù)庫更新,此時由于提交數(shù)據(jù)版本大于數(shù)據(jù)庫記錄當(dāng)前版本,數(shù)據(jù)被更新,數(shù)據(jù)庫記錄 version 更新為 2 。
  4. 操作員 B 完成了操作,也將版本號加一( version=2 )試圖向數(shù)據(jù)庫提交數(shù)據(jù)( balance=$80 ),但此時比對數(shù)據(jù)庫記錄版本時發(fā)現(xiàn),操作員 B 提交的數(shù)據(jù)版本號為 2 ,數(shù)據(jù)庫記錄當(dāng)前版本也為 2 ,不滿足 “ 提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新 “ 的樂觀鎖策略,因此,操作員 B 的提交被駁回。 這樣,就避免了操作員 B 用基于 version=1 的舊數(shù)據(jù)修改的結(jié)果覆蓋操作員A 的操作結(jié)果的可能。

CAS算法

即compare and swap(比較與交換),是一種有名的無鎖算法。無鎖編程,即不使用鎖的情況下實(shí)現(xiàn)多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實(shí)現(xiàn)變量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三個操作數(shù)

需要讀寫的內(nèi)存值 V 進(jìn)行比較的值 A 擬寫入的新值 B 當(dāng)且僅當(dāng) V 的值等于 A時,CAS通過原子方式用新值B來更新V的值,否則不會執(zhí)行任何操作(比較和替換是一個原子操作)。一般情況下是一個自旋操作,即不斷的重試。

以上就是Java中的悲觀鎖與樂觀鎖是什么的詳細(xì)內(nèi)容,更多關(guān)于Java 悲觀鎖與樂觀鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?List排序?qū)嵗a詳解

    Java?List排序?qū)嵗a詳解

    這篇文章主要介紹了Java?List排序的相關(guān)資料,Java排序方法包括自然排序、自定義排序、Lambda簡化及多條件排序,實(shí)現(xiàn)靈活且代碼簡潔,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-05-05
  • Java實(shí)現(xiàn)打飛機(jī)小游戲(附完整源碼)

    Java實(shí)現(xiàn)打飛機(jī)小游戲(附完整源碼)

    這篇文章主要介紹了Java實(shí)現(xiàn)打飛機(jī)小游戲(附完整源碼),這里整理了詳細(xì)的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 寧可用Lombok也不把成員設(shè)置為public原理解析

    寧可用Lombok也不把成員設(shè)置為public原理解析

    這篇文章主要為大家介紹了寧可用Lombok也不把成員設(shè)置為public原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Spring?Cache簡單介紹和使用大全

    Spring?Cache簡單介紹和使用大全

    Spring?Cache是一個框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實(shí)現(xiàn)緩存功能,這篇文章主要介紹了Spring?Cache簡介和使用,需要的朋友可以參考下
    2023-03-03
  • SpringBoot實(shí)現(xiàn)簡單的登錄注冊的項(xiàng)目實(shí)戰(zhàn)

    SpringBoot實(shí)現(xiàn)簡單的登錄注冊的項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了SpringBoot實(shí)現(xiàn)簡單的登錄注冊的項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java 集合框架高級應(yīng)用與架構(gòu)設(shè)計方案

    Java 集合框架高級應(yīng)用與架構(gòu)設(shè)計方案

    文章主要介紹了Java集合框架在復(fù)雜架構(gòu)場景中的高級應(yīng)用,包括緩存設(shè)計、分層存儲、數(shù)據(jù)分片、設(shè)計模式融合實(shí)踐、大數(shù)據(jù)量處理以及分布式場景中集合的適配問題和優(yōu)化方案,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Java編程環(huán)境搭建和變量基本使用圖文教程

    Java編程環(huán)境搭建和變量基本使用圖文教程

    這篇文章主要介紹了Java編程環(huán)境搭建和變量基本使用,結(jié)合圖文形式詳細(xì)分析了java編程語言環(huán)境搭建、配置、變量、注釋的基本使用方法,需要的朋友可以參考下
    2020-02-02
  • SpringBoot實(shí)現(xiàn)熱部署詳解

    SpringBoot實(shí)現(xiàn)熱部署詳解

    SpringBoot熱部署是一種開發(fā)時極為有用的功能,它能夠讓開發(fā)人員在代碼修改后無需手動重啟應(yīng)用程序就能立即看到變化的效果,所以我本文就給打擊介紹一下為什么要使用熱部署以及實(shí)現(xiàn)熱部署的方式,需要的朋友可以參考下
    2023-07-07
  • java8中的Collectors.groupingBy用法詳解

    java8中的Collectors.groupingBy用法詳解

    這篇文章主要介紹了java8中的Collectors.groupingBy用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • JAVA操作HDFS案例的簡單實(shí)現(xiàn)

    JAVA操作HDFS案例的簡單實(shí)現(xiàn)

    本篇文章主要介紹了JAVA操作HDFS案例的簡單實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

阳春市| 秦安县| 英山县| 八宿县| 青州市| 丘北县| 宿迁市| 天峨县| 祥云县| 商都县| 枞阳县| 临高县| 新疆| 五华县| 资阳市| 绿春县| 宜城市| 武汉市| 田东县| 尼木县| 广安市| 雷州市| 瓮安县| 凌云县| 抚州市| 青州市| 阿图什市| 双江| 吉木萨尔县| 且末县| 永和县| 宝坻区| 泽库县| 崇阳县| 水城县| 瓦房店市| 武乡县| 治多县| 滦南县| 内江市| 潍坊市|