JUC總結3

CAS

簡介

CAS的全稱是“比較并交換”,是一種無鎖的原子操作,其體現了樂觀所的思想,在無鎖的情況下保證線程操作共享數據的原子性。

CAS一共有3個值:

1、V:要更新的值;

2、E:預期值;

3、N:新值。

在比較和交換的過程中,需要比較V與E是否相等,若相等,則將V設置為N;若不相等,則說明有其他線程對共享變量進行了更新,當前線程應放棄。若CAS失敗,則繼續嘗試獲取新值,直至更新成功。

CAS底層實現

CAS底層是通過Unsafe類來直接調用操作系統底層的CAS指令,Unsafe類中的方法都是native方法,由系統提供接口實現,Unsafe類對CAS實現是通過C++進行的。

CAS存在的問題

ABA問題

ABA問題是指一個位置原來是A,后面被改為B,再后來又被改為A,進行CAS操作的線程無法知道在該位置的值發生過改變。

可通過加入時間戳或版本號的方式,解決ABA問題,在進行CAS操作時,需要值和版本號(或時間戳)均匹配時才能進行修改操作。在Java中,AtomicStampedReference類就實現了這種機制,它會同時檢查引用值和stamp是否都相等。

循環性能開銷問題

CAS在進行自旋操作時,若一直不成功,則會給CPU代理巨大的開銷,可通過限制自旋次數來解決這個問題。

只能保證一個變量的原子操作

CAS只能保證對一個變量進行原子操作,當存在多個變量時,CAS無法直接保證對他們的原子操作。可通過以下兩種方式解決:

1、考慮改用鎖實現原子操作;

2、合并多個變量,將多個變量封裝成一個對象,通過AtomicReference來保證原子性。

volatile

volatile的主要作用

保證變量在線程間的可見性

當一個線程修改某個變量的值時,volatile關鍵字會將修改的值刷新到主存中,該新值就對其他線程可見,對于volatile修飾的關鍵字,禁止使用JIT(即時編譯器)進行優化。

禁止指令重排序

使用volatile修飾的變量,會在讀、寫共享變量時加上屏障,阻止其他讀寫操作越過屏障對共享變量進行讀寫操作。

對于volatile的寫操作,會在其前后加上屏障,其中在寫操作前的屏障,禁止前面的普通讀操作與該寫操作重排;寫操作后的屏障,禁止后面的volatile讀寫操作與該寫操作重排序,如下圖所示:

對于volatile的讀操作,會在其后面加上屏障,禁止后面的普通讀寫操作與重排序,該屏障強制讓本地內存中的變量值失效,從而重新從主內存中讀取最新的值,如下圖所示:

對于volatile的寫操作前的操作,不會被編譯器重排到該寫操作后;對于volatile的讀操作后的操作,不會被編譯器重排到該寫操作前。

AQS

AQS是阻塞式鎖和相關同步工具的框架,中文名為抽象隊列同步器,它是構建鎖或其他同步組件的基礎框架。其思想是,若被請求的資源空閑,則線程申請該資源成功,反之該線程則進入一個等待隊列,其他線程釋放該資源時,系統隨機選擇一個在等待隊列中的線程,賦予其資源。

AQS是悲觀鎖,通過Java實現,其開啟和釋放都需要手動進行,其工作機制是:

同步狀態state由volatile修飾,保證其他線程對其可見,同時采用一個FIFO雙端隊列存儲線程,如下圖所示:

當線程要獲取鎖時,會嘗試改變state的狀態,若state狀態為0,則可將其改為1,該線程搶占鎖成功。若線程強制鎖失敗,則線程進入FIFO隊列中等待。

AQS通過CAS自旋鎖保證線程的原子性,保證每次只能有一個線程修改state成功。

AQS既可實現公平鎖,又可實現非公平鎖。當新來的線程與隊列中的線程共同強資源時,該鎖為非公平鎖(如AQS實現類ReentrantLock),新來的線程進入等待隊列中等待,只允許隊列中head線程占用資源時,該鎖為公平鎖。

ReentrantLock

概述

ReentrantLock是可重入鎖,其可中斷、可設置超時時間、可設置公平鎖、支持多個條件變量、支持重入。ReentrantLock主要利用CAS+AQS實現的,通過new ReentrantLock()創建的鎖默認為非公平鎖,要將其設置為公平鎖,則應該通過有參構造函數的方式創建,并將變量設置為true(該變量設置為false時實現的非公平鎖),代碼:

//實現公平鎖
ReentrantLock lock = new ReentrantLock(true);

構造函數如下圖:

NonfairSync、FairSync的父類為Sync,Sync的父類為AQS。

加鎖

調用lock()方法可實現加鎖,unlock()方法實現解鎖。在公平鎖的條件下,鎖會授予給等待時間最長的線程,在非公平鎖的條件下,其加鎖的方式如下:

當線程調用lock()嘗試獲取鎖時,首先通過CAS方式修改state變量,若成功將其修改為1,則讓exclusiveOwnerThread線程指向這個線程,該線程獲取鎖成功。若修該失敗,則線程獲取鎖失敗,則線程進入等待隊列中。當exclusiveOwnerThread為null時,則持有鎖的線程釋放了鎖,則會喚醒雙向隊列中在head位置的線程,公平鎖和非公平鎖的情況見上述AQS介紹。

為了實現鎖的可重入,ReentrantLock內部有一個計數器跟蹤線程持有鎖的次數,當線程首次獲取鎖時,計數器的值變為1,如果同一線程再次獲取鎖,計數器增加;每釋放一次鎖,計數器減 1。當線程調用unlock()方法時,ReentrantLock會將持有鎖的計數減1,如果計數到達0,則釋放鎖,并喚醒等待隊列中的線程來競爭鎖。

Synchronized和Lock對比

1、Synchronized是關鍵字,源碼在JVM中,通過C++實現;而Lock是接口,源碼由JDK提供,通過Java實現;

2、使用Synchronized時,退出同步代碼塊會自動釋放鎖,而使用lock時,需要通過unlock()釋放;

3、兩種都是悲觀鎖,支持互斥、同步、鎖重入等功能;

4、相比于Synchronized,Lock支持獲取鎖狀態、設置公平鎖、可打斷、可超時等,同時支持ReentrantLock、ReentrantReadWriteLock不同適合條件的實現;

5、在沒有競爭時,Synchronized做了如偏向鎖、輕量級鎖等優化,但在競爭激烈時,Lock的性能更好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22218.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RHCE (Linux進階) Ubuntu 操作系統安裝教程

一、在官網下載iso鏡像文件 下載地址: https://cn.ubuntu.com/download/server/step1#downloads(下載最新的Ubuntu 20.04 LTS服務器版本) 二、VMware安裝配置過程 基本安裝過程 1、新建虛擬機 2、選擇典型即可 3、設置下載好的Ubuntu對應路…

Exception異常機制詳細講解

目錄 一、異常1.1 什么是異常1.2 異常機制的作用1.3 常見的異常2.3 異常的分類1. Error2. Exception① 運行時異常② 編譯期異常總結: 二、異常的處理2.1 拋出異常3.1 拋出異常語法3.2 試圖捕獲異常3.3 捕獲異常與拋出異常的區別1. 拋出異常2.捕獲異常 三、finally四…

Spring Cloud:構建高可用分布式系統的利器

摘要:本文將介紹Spring Cloud,一個基于Spring Boot的開源微服務架構工具集。我們將探討Spring Cloud的核心組件、特性以及如何使用Spring Cloud構建高可用、分布式系統。通過本文,讀者將了解到Spring Cloud在實現微服務架構中的應用和優勢。 …

【Springcloud微服務】MybatisPlus下篇

🔥 本文由 程序喵正在路上 原創,CSDN首發! 💖 系列專欄:Springcloud微服務 🌠 首發時間:2024年6月4日 🦋 歡迎關注🖱點贊👍收藏🌟留言&#x1f43…

24、matlab二維和三維網格(meshgrid函數)以及散點數據插值 griddata()函數

1、二維和三維網格(meshgrid函數) 語法 語法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐標返回二維網格坐標。 語法2:[X,Y] = meshgrid(x) 與 [X,Y] = meshgrid(x,x) 相同,并返回網格大小為 length(x)length(x) 的方形網格坐標。 語法3:[X,Y,Z] = meshgrid(x,y,…

汽車銷售門店零售價格違規檢查的實踐經驗方法

隨著汽車市場的蓬勃發展,汽車銷售門店的零售價格合規性日益受到業界和消費者的關注。為確保銷售過程的公平與透明,開展零售價格違規檢查顯得尤為重要。 在這方面,深圳神秘顧客(SMS)公司憑借其深厚的實踐經驗和專業技巧…

弘君資本炒股開戶:如何看待股價波動?

在股票商場上股價的動搖無疑是投資者最為關心的話題之一,面臨股價的起伏不定投資者往往會感到迷茫和焦慮。關于怎么看待股價動搖,弘君資本下面就為大家詳細介紹一下。 股價動搖是股市運行的常態,股市是國民經濟的晴雨表,股票價格…

Flink run 自動化運行任務shell腳本

Linux命令行: sh flink_run.sh test com.dzj.app.base.test.FlinkKafkaOffsetTest /root/soft/test.jar flink_run.sh腳本內容: #!/bin/bash# 檢查參數數量是否正確 if [ "$#" -ne 3 ]; thenecho "錯誤:需要提供 3 個參數&…

SpringBoot+layui實現Excel導入操作

excel導入步驟 第三方插件引入插件 效果圖 (方法1)代碼實現(方法1)Html代碼( 公共)下載導入模板 js實現 (方法1)上傳文件實現 效果圖(方法2)代碼實現&#xf…

多語言大模型 Aya-23 開源!覆蓋23種語言,性能刷新SOTA

文章目錄 1. Aya-23 技術特點1.1 預訓練階段1.2 指令微調階段 2. Aya-23 性能表現3. Aya-23 多語言任務評估4. Aya-23 支持 23 種語言5. Aya-23 應用場景 近年來,多語言大模型(MLLM)發展迅速,但大多數模型的性能依然存在顯著差距&…

“滴滴打車,用友入賬”,YonSuite商旅費控助力企業“降低成本”更進一步

在當今競爭激烈的商業環境中,企業對于成本控制和效率提升的需求日益迫切。特別是在商旅管理方面,如何有效整合資源、優化流程、降低費用,成為了成長型企業關注的焦點。用友YonSuite商旅費控作為用友集團旗下的重要產品,憑借其卓越…

ctfshow pwn17-18

毛坯的人生和精裝的朋友圈 pwn17 while ( 1 ){menu();v4 0;puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");__isoc99_scanf("%d", &v4);switch ( v4 ){case 1:system("id");break;case 2:puts("Which directory?(/,…

克隆別人的項目并上傳到自己的倉庫

克隆別人的項目并上傳到自己的倉庫通常涉及以下步驟: 克隆項目:首先,你需要將別人的項目克隆到你的本地計算機。可以使用以下Git命令: git clone [項目的URL]將 [項目的URL] 替換為你想克隆的項目的URL。 創建新的倉庫&#xff1…

卡爾曼濾波算法的matlab實現

卡爾曼濾波算法的matlab實現 figure; hold on;Z(1:1:100); %觀測值:第一秒觀測1m 第二秒觀測兩米 勻速運動, 每秒1m, 最后擬合的也是速度 1m/splot(Z); plot([0,100], [1,1]);noiserandn(1,100)*0.5; %生成方差為1的高斯噪聲 ZZnoise; % 加入噪聲plot(Z);X[0;…

LabVIEW動態力傳感器校準系統

LabVIEW動態力傳感器校準系統 開發了一種基于LabVIEW的動態力傳感器校準系統。系統主要用于動態力的測量和校準,通過高度集成化和自動化的設計,顯著提升校準的效率和精確度。系統采用沖擊法進行動態校準,涵蓋了完整的硬件設計和軟件開發流程…

Kotlin 注解

文章目錄 定義注解類的注解標注目標聲明 定義 注解使用annotation關鍵字定義,且只能用于普通類,該類被稱為注釋類。可以使用注釋類為某個變量、函數、類、接口等注釋。與我們寫的代碼注釋類似,注釋類可以指明被標注類的狀態、作用等等&#…

智能體應用開發:構建各類垂直領域的ai智能體應用

最近在做個類似的項目,有用到這方面的知識,順便做一些記錄和筆記吧,希望能幫到大家了解智能體應用開發 目錄 引言 AI原生應用的興起 智能體在AI中的角色 實現原理詳解 機器學習基礎 數據管理與關聯數據庫 數據結構 Embedding 檢索方…

Pytorch實用教程:torch.cat()函數的用法詳解

torch.cat 是 PyTorch 中用于沿指定維度連接張量的函數。以下是該函數的詳細用法: 語法 torch.cat(tensors, dim=0, *, out=None)參數說明 tensors (sequence of Tensors): 要連接的張量序列。這些張量必須具有相同的形狀(除了連接的維度)。dim (int, optional): 沿著哪個…

衛星位置解算

前言: 本章節代碼均在Gitee中開源: 衛星位置計算代碼https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/GPS%E5%8D%AB%E6%98%9F%E4%BD%8D%E7%BD%AE%E8%A7%A3%E7%AE%97/Satellit…

SAP物料自動記賬科目設置總結

SAP物料自動記賬科目設置總結 目錄 物料自動記賬科目設置總結... 1 總體說明... 1 庫存移動事務類型的設置... 4 庫存科目設置... 6 期初導入... 6 業務舉例... 6 配置... 6 庫存初始單據... 7 采購收貨(缺少到票) 8 業務舉例... 8 配置... 8 采購收貨單據-MIGO_GR…