成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

美團終面:你確定CAS不加鎖嗎?

開發 前端
我們以Java.util.concurrent中的AtomicInteger為例,看一下在不使用鎖的情況下是如何保證線程安全的。主要理解getAndIncrement方法,該方法的作用相當于 ++i 操作。

CAS大家都知道,這是一項樂觀鎖技術,是Compare And Swap的簡稱,顧名思義就是先比較再替換。

雖然他叫樂觀鎖,但是我們都知道它是不需要加鎖的,在JDK1.5 中的JUC就是建立在CAS之上的。相對于synchronized這種阻塞算法,CAS是非阻塞算法的一種常見實現。所以J.U.C在性能上有了很大的提升。

我們以java.util.concurrent中的AtomicInteger為例,看一下在不使用鎖的情況下是如何保證線程安全的。主要理解getAndIncrement方法,該方法的作用相當于 ++i 操作:

public class AtomicInteger extends Number implements java.io.Serializable {  
private volatile int value;
public final int get() {
return value;
}
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
}

getAndIncrement采用了CAS操作,每次從內存中讀取數據然后將此數據和+1后的結果進行CAS操作,如果成功就返回結果,否則重試直到成功為止。而compareAndSet利用unsafe的compareAndSwapInt方法實現的。

啥是Unsafe呢?

Unsafe是CAS的核心類。因為Java無法直接訪問底層操作系統,而是通過本地(native)方法來訪問。不過盡管如此,JVM還是開了一個后門,JDK中有一個類Unsafe,它提供了硬件級別的原子操作。

Unsafe是Java中一個底層類,包含了很多基礎的操作,比如數組操作、對象操作、內存操作、CAS操作、線程(park)操作、柵欄(Fence)操作,JUC包、一些三方框架都使用Unsafe類來保證并發安全。

Unsafe類提供了硬件級別的原子操作,如CAS原子操作。

?但是,大家有沒有想過這樣的問題:

硬件層面CAS又是如何保證原子性的呢?真的完全沒加鎖嗎?

拿比較常見的x86架構的CPU來說,其實 CAS 操作通常使用 cmpxchg 指令實現的。

可是為啥cmpxchg 指令能保證原子性呢?主要是有以下幾個方面的保障:

1.  cmpxchg 指令是一條原子指令。在 CPU 執行 cmpxchg 指令時,處理器會自動鎖定總線,防止其他 CPU 訪問共享變量,然后執行比較和交換操作,最后釋放總線。

2.  cmpxchg 指令在執行期間,CPU 會自動禁止中斷。這樣可以確保 CAS 操作的原子性,避免中斷或其他干擾對操作的影響。

3.  cmpxchg 指令是硬件實現的,可以保證其原子性和正確性。CPU 中的硬件電路確保了 cmpxchg 指令的正確執行,以及對共享變量的訪問是原子的。

所以,在操作系統層面,CAS還是會加鎖的,通過加鎖的方式鎖定總線,避免其他CPU訪問共享變量。

所以,解決并發問題,歸根結底還得靠鎖!

責任編輯:姜華 來源: Hollis
相關推薦

2024-05-27 11:35:40

2024-04-01 00:00:00

Redis緩存服務消息隊列

2024-04-22 00:00:00

CASCPU硬件

2024-10-31 08:50:14

2017-06-02 08:48:29

互斥鎖JavaCAS

2022-08-27 13:50:44

TCP服務端函數

2022-09-12 15:55:57

TCP函數程序

2023-04-21 13:57:38

Redis阻塞半自動

2024-04-24 09:02:58

線程池面試鎖升級

2023-04-03 07:57:00

2024-09-18 09:02:14

單核服務器線程切換

2021-09-09 19:08:49

JDK版本Java

2023-04-03 10:24:00

spring事務場景

2025-03-25 12:00:00

@Value?Spring開發

2022-09-08 13:56:49

MySQL事務記錄鎖

2025-06-05 03:10:00

mmapmalloc共享內存

2015-10-19 09:57:02

阿里美團大眾

2023-07-13 09:16:47

循環隊列指針front?

2024-04-15 08:37:35

2022-08-24 07:44:53

流量系統數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久香蕉精品视频 | 欧美成人精品二区三区99精品 | 日日干日日操 | www久久av| 久久成人一区 | 久久久久高清 | 色婷婷综合在线观看 | 国产网站在线免费观看 | 热久久国产| 国产视频精品区 | 国产精品久久久久久久久久久久冷 | 免费av手机在线观看 | 99精品视频一区二区三区 | 日韩一区二区三区在线观看 | 亚洲视频在线观看 | 精区3d动漫一品二品精区 | 精品国产高清一区二区三区 | 成人精品一区二区三区中文字幕 | 欧美一级毛片在线播放 | 国产精品久久久久久久久久久久久 | 国产精品小视频在线观看 | 人人干人人看 | 97在线观视频免费观看 | 国产亚洲成av人片在线观看桃 | 国产成人综合一区二区三区 | 国产黄色免费网站 | 国产视频中文字幕 | 久操av在线| 国产高清一区二区三区 | 国产精品久久久久无码av | 蜜桃精品视频在线 | 波多野结衣精品 | 天天干人人 | 亚洲美女av网站 | 综合久久久久久久 | 国产在线视频三区 | 国产一区二区小视频 | 国产精品久久国产精品 | 亚洲一区视频在线播放 | 日本精品久久 | 伊人伊人网 |