亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文秒懂Java中的樂觀鎖 VS 悲觀鎖

 更新時間:2021年05月06日 10:38:15   作者:小劉你最強  
這篇文章主要介紹了java樂觀鎖 VS 悲觀鎖的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

樂觀鎖 VS 悲觀鎖

悲觀鎖:總是假設最壞的情況,每次取數據時都認為其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起。

樂觀鎖:總是認為不會產生并發(fā)問題,每次去取數據的時候總認為不會有其他線程對數據進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數據進行修改。
樂觀鎖在Java中通過使用無鎖來實現,常用的是CAS,Java中原子類的遞增就是通過CAS自旋實現。

在這里插入圖片描述

CAS

CAS全稱 Compare And Swap(比較與交換),是一種無鎖算法。在不使用鎖(沒有線程被阻塞)的情況下實現多線程之間的變量同步。java.util.concurrent包中的原子類就是通過CAS來實現了樂觀鎖。

一個 CAS 涉及到以下操作:
我們假設內存中的原數據V,舊的預期值A,需要修改的新值B,

  1. 比較 A 與 V 是否相等。(比較)
  2. 如果比較相等,將 B 寫入 V。(交換)
  3. 返回操作是否成功。

CAS的底層原理

  • 調用 Unsafe 類中的 CAS 方法,JVM 會幫我們實現出 CAS 匯編指令
  • 這是一種完全依賴于硬件的功能,通過它實現原子操作
  • 原語的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷,CAS 是 CUP 的一條原子指令

CAS的三大問題

  • 如果 CAS 長時間一直不成功,會給 CPU 帶來很大的開銷,在Java的實現中是一只通過while循環(huán)自旋CAS獲取鎖。
  • 只能保證一個共享變量的原子操作
  • 引出了 ABA 問題

ABA問題

CAS需要在操作值的時候檢查內存值是否發(fā)生變化,沒有發(fā)生變化才會更新內存值。但是如果內存值原來是A,后來變成了B,然后又變成了A,那么CAS進行檢查時會發(fā)現值沒有發(fā)生變化,但是實際上是有變化的。

如何解決ABA問題
加入版本信息,例如攜帶 AtomicStampedReference 之類的時間戳作為版本信息,保證不會出現老的值。

UnSafe

Unsafe類是在sun.misc包下,不屬于Java標準。但是很多Java的基礎類庫,包括一些被廣泛使用的高性能開發(fā)庫都是基于Unsafe類開發(fā)的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe類在提升Java運行效率,增強Java語言底層操作能力方面起了很大的作用。

使用Unsafe可用來直接訪問系統(tǒng)內存資源并進行自主管理,Unsafe類在提升Java運行效率,增強Java語言底層操作能力方面起了很大的作用。

Unsafe可認為是Java中留下的后門,提供了一些低層次操作,如直接內存訪問、線程調度等。

這個類的提供了一些繞開JVM的更底層功能,基于它的實現可以提高效率。但是,它是一把雙刃劍:正如它的名字所預示的那樣,它是Unsafe的,它所分配的內存需要手動free(不被GC回收)。如果對Unsafe類理解的不夠透徹,就進行使用的話,就等于給自己挖了無形之坑,最為致命。

到此這篇關于一文秒懂樂觀鎖 VS 悲觀鎖的文章就介紹到這了,更多相關java樂觀鎖 悲觀鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java批量插入數據的代碼實現

    Java批量插入數據的代碼實現

    日常工作或者學習中,可能會遇到批量插入數據的需求,一般情況下數據量少的時候,我們會直接調用批量接口插入數據即可,當數據量特別大時,我們就會用到分批插入數據,所以本文給大家介紹了Java批量插入數據的代碼實現,需要的朋友可以參考下
    2024-01-01
  • 一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    本文主要介紹了一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Mybatis generator的使用全面解析

    Mybatis generator的使用全面解析

    這篇文章主要介紹了Mybatis generator的使用,非常不錯,具有參考借鑒價值,對mybatis generator的使用相關知識感興趣的朋友一起學習吧
    2016-09-09
  • springboot項目使用nohup將日志指定輸出文件過大問題及解決辦法

    springboot項目使用nohup將日志指定輸出文件過大問題及解決辦法

    在Spring Boot項目中,使用nohup命令重定向日志輸出到文件可能會使日志文件過大,文章介紹了兩種解決方法:一是創(chuàng)建腳本直接清除日志文件,二是創(chuàng)建腳本保留部分日志內容,并將這些腳本加入定時任務中,這可以有效控制日志文件的大小,避免占用過多磁盤空間
    2024-10-10
  • 詳解Java設計模式之外觀模式

    詳解Java設計模式之外觀模式

    在Java開發(fā)中,設計模式是一種十分常見的編程思想,它可以幫助我們解決很多實際開發(fā)中的問題,本篇文章將介紹一種常見的設計模式——外觀模式,并結合實際的開發(fā)場景進行講解,需要的朋友可以參考下
    2023-06-06
  • SpringBoot Pom文件依賴及Starter啟動器詳細介紹

    SpringBoot Pom文件依賴及Starter啟動器詳細介紹

    這篇文章主要介紹了SpringBoot Pom文件的依賴與starter啟動器的作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Java實現統(tǒng)計字符串出現的次數

    Java實現統(tǒng)計字符串出現的次數

    這篇文章主要為大家詳細介紹了Java實現統(tǒng)計字符串出現的次數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spring MVC url提交參數和獲取參數

    Spring MVC url提交參數和獲取參數

    本文重要講述通過url提交參數和獲取參數的具體操作與實現。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • spring框架集成flyway項目的詳細過程

    spring框架集成flyway項目的詳細過程

    今天通過本文給大家分享spring框架集成flyway項目的詳細過程,由于大多數都是springboot集成flyway,很少見到spring框架的項目,今天就抽空給大家介紹下spring框架集成flyway項目的方法,一起看看吧
    2021-07-07
  • Java中SPI的一些理解

    Java中SPI的一些理解

    這篇文章主要介紹了Java中SPI的一些理解,幫助大家更好的理解和學習Java的相關知識,感興趣的朋友可以了解下
    2020-12-12

最新評論