欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文秒懂Java中的樂(lè)觀(guān)鎖 VS 悲觀(guān)鎖

 更新時(shí)間:2021年05月06日 10:38:15   作者:小劉你最強(qiáng)  
這篇文章主要介紹了java樂(lè)觀(guān)鎖 VS 悲觀(guān)鎖的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

樂(lè)觀(guān)鎖 VS 悲觀(guān)鎖

悲觀(guān)鎖:總是假設(shè)最壞的情況,每次取數(shù)據(jù)時(shí)都認(rèn)為其他線(xiàn)程會(huì)修改,所以都會(huì)加鎖(讀鎖、寫(xiě)鎖、行鎖等),當(dāng)其他線(xiàn)程想要訪(fǎng)問(wèn)數(shù)據(jù)時(shí),都需要阻塞掛起。

樂(lè)觀(guān)鎖:總是認(rèn)為不會(huì)產(chǎn)生并發(fā)問(wèn)題,每次去取數(shù)據(jù)的時(shí)候總認(rèn)為不會(huì)有其他線(xiàn)程對(duì)數(shù)據(jù)進(jìn)行修改,因此不會(huì)上鎖,但是在更新時(shí)會(huì)判斷其他線(xiàn)程在這之前有沒(méi)有對(duì)數(shù)據(jù)進(jìn)行修改。
樂(lè)觀(guān)鎖在Java中通過(guò)使用無(wú)鎖來(lái)實(shí)現(xiàn),常用的是CAS,Java中原子類(lèi)的遞增就是通過(guò)CAS自旋實(shí)現(xiàn)。

在這里插入圖片描述

CAS

CAS全稱(chēng) Compare And Swap(比較與交換),是一種無(wú)鎖算法。在不使用鎖(沒(méi)有線(xiàn)程被阻塞)的情況下實(shí)現(xiàn)多線(xiàn)程之間的變量同步。java.util.concurrent包中的原子類(lèi)就是通過(guò)CAS來(lái)實(shí)現(xiàn)了樂(lè)觀(guān)鎖。

一個(gè) CAS 涉及到以下操作:
我們假設(shè)內(nèi)存中的原數(shù)據(jù)V,舊的預(yù)期值A(chǔ),需要修改的新值B,

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

CAS的底層原理

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

CAS的三大問(wèn)題

  • 如果 CAS 長(zhǎng)時(shí)間一直不成功,會(huì)給 CPU 帶來(lái)很大的開(kāi)銷(xiāo),在Java的實(shí)現(xiàn)中是一只通過(guò)while循環(huán)自旋CAS獲取鎖。
  • 只能保證一個(gè)共享變量的原子操作
  • 引出了 ABA 問(wèn)題

ABA問(wèn)題

CAS需要在操作值的時(shí)候檢查內(nèi)存值是否發(fā)生變化,沒(méi)有發(fā)生變化才會(huì)更新內(nèi)存值。但是如果內(nèi)存值原來(lái)是A,后來(lái)變成了B,然后又變成了A,那么CAS進(jìn)行檢查時(shí)會(huì)發(fā)現(xiàn)值沒(méi)有發(fā)生變化,但是實(shí)際上是有變化的。

如何解決ABA問(wèn)題
加入版本信息,例如攜帶 AtomicStampedReference 之類(lèi)的時(shí)間戳作為版本信息,保證不會(huì)出現(xiàn)老的值。

UnSafe

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

使用Unsafe可用來(lái)直接訪(fǎng)問(wèn)系統(tǒng)內(nèi)存資源并進(jìn)行自主管理,Unsafe類(lèi)在提升Java運(yùn)行效率,增強(qiáng)Java語(yǔ)言底層操作能力方面起了很大的作用。

Unsafe可認(rèn)為是Java中留下的后門(mén),提供了一些低層次操作,如直接內(nèi)存訪(fǎng)問(wèn)、線(xiàn)程調(diào)度等。

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

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

相關(guān)文章

  • Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn)

    Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn)

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

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

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

    Mybatis generator的使用全面解析

    這篇文章主要介紹了Mybatis generator的使用,非常不錯(cuò),具有參考借鑒價(jià)值,對(duì)mybatis generator的使用相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09
  • springboot項(xiàng)目使用nohup將日志指定輸出文件過(guò)大問(wèn)題及解決辦法

    springboot項(xiàng)目使用nohup將日志指定輸出文件過(guò)大問(wèn)題及解決辦法

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

    詳解Java設(shè)計(jì)模式之外觀(guān)模式

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

    SpringBoot Pom文件依賴(lài)及Starter啟動(dòng)器詳細(xì)介紹

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

    Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù)

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

    Spring MVC url提交參數(shù)和獲取參數(shù)

    本文重要講述通過(guò)url提交參數(shù)和獲取參數(shù)的具體操作與實(shí)現(xiàn)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • spring框架集成flyway項(xiàng)目的詳細(xì)過(guò)程

    spring框架集成flyway項(xiàng)目的詳細(xì)過(guò)程

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

    Java中SPI的一些理解

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

最新評(píng)論