偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java開發(fā)者必懂:Synchronized、Volatile與CAS的使用場(chǎng)景與性能對(duì)比

開發(fā) 前端
我們今天的任務(wù),不是簡(jiǎn)單地列舉每一個(gè)概念的定義,而是通過講故事的方式,讓大家不僅理解它們的作用和區(qū)別,還能深刻理解它們背后所涉及的性能、安全以及使用場(chǎng)景。

引言

大家好!我是小米,今天帶來的是一場(chǎng)Java面試的重頭戲——synchronized、volatile、CAS的比較。這三者作為Java多線程編程中的三大關(guān)鍵概念,常常是面試官用來考察一個(gè)開發(fā)者對(duì)多線程和并發(fā)處理能力的必考題??此坪?jiǎn)單的一道題,往往能考察你對(duì)并發(fā)的理解程度。

我們今天的任務(wù),不是簡(jiǎn)單地列舉每一個(gè)概念的定義,而是通過講故事的方式,讓大家不僅理解它們的作用和區(qū)別,還能深刻理解它們背后所涉及的性能、安全以及使用場(chǎng)景。

圖片圖片

故事的開端:一場(chǎng)并發(fā)戰(zhàn)爭(zhēng)的前奏

想象一下,你和你的朋友們?cè)谝患也蛷d中等著點(diǎn)餐。餐廳的服務(wù)員有很多,但并不是每個(gè)人都可以同時(shí)為你服務(wù)。餐廳有一個(gè)原則——每個(gè)人只能在自己的座位上點(diǎn)餐,而每一份餐點(diǎn)都需要服務(wù)員來為你提交和準(zhǔn)備。你的任務(wù)是,要盡可能地把訂單提交給服務(wù)員,確保菜品能及時(shí)、準(zhǔn)確地到達(dá)。

在這個(gè)簡(jiǎn)單的比喻中,我們可以將服務(wù)員比作Java中的線程,而你的訂單就是要被提交的共享資源,你和朋友們的等待時(shí)間,就是對(duì)這個(gè)共享資源的競(jìng)爭(zhēng)。隨著餐廳中客人的增多,服務(wù)員的數(shù)量和工作效率就變得尤為關(guān)鍵。

這個(gè)故事的背后,藏著Java中的三大機(jī)制:synchronized、volatile和CAS。它們就像餐廳里的規(guī)則和技巧,幫助你高效而且安全地提交訂單。

第一章:synchronized——安全有保障的鎖

餐廳的隊(duì)伍管理

當(dāng)服務(wù)員數(shù)量有限時(shí),想讓每個(gè)顧客都能順利點(diǎn)餐,不發(fā)生混亂,一個(gè)簡(jiǎn)單的隊(duì)伍管理機(jī)制就顯得格外重要。這個(gè)時(shí)候,餐廳引入了一個(gè)隊(duì)列系統(tǒng):只有一個(gè)顧客可以在隊(duì)伍中與服務(wù)員交互,其他顧客必須排隊(duì)等候。這就像Java中的 synchronized,它為共享資源加上了鎖,確保在同一時(shí)刻只有一個(gè)線程(顧客)能夠訪問共享資源(點(diǎn)餐系統(tǒng))。

synchronized 是Java中的一個(gè)關(guān)鍵字,它提供了一種線程間同步的機(jī)制,能夠保證同一時(shí)刻只有一個(gè)線程執(zhí)行被它修飾的代碼塊或方法。簡(jiǎn)單來說,synchronized 用來解決“線程安全問題”,防止多個(gè)線程在同一時(shí)刻修改共享變量,造成數(shù)據(jù)不一致。

示例代碼:

圖片圖片

在這個(gè)例子中,increment() 和 getCount() 方法被加上了 synchronized,意味著在同一時(shí)刻,只有一個(gè)線程能夠進(jìn)入這兩個(gè)方法,從而避免了競(jìng)爭(zhēng)條件。

鎖的代價(jià)

然而,synchronized 的缺點(diǎn)也非常明顯——它的性能開銷較大。因?yàn)樗峭ㄟ^操作系統(tǒng)提供的鎖機(jī)制來進(jìn)行線程同步的,每當(dāng)一個(gè)線程獲取鎖時(shí),其他線程必須等待,這樣就會(huì)導(dǎo)致上下文切換,性能上會(huì)有損耗。如果頻繁的獲取和釋放鎖,可能會(huì)導(dǎo)致系統(tǒng)的吞吐量降低。

第二章:volatile——輕量級(jí)的線程間共享

餐廳的公告板

假設(shè)你和你的朋友們有時(shí)會(huì)等待菜品,或者看到公告板上的提示,決定是否去另外一個(gè)區(qū)域等待。你不需要每次都問服務(wù)員,只需要看公告板的內(nèi)容,如果公告板顯示已經(jīng)準(zhǔn)備好了菜品,你就可以立刻去領(lǐng)取。

這個(gè)例子中的公告板就像Java中的 volatile 變量。volatile 是一個(gè)輕量級(jí)的同步機(jī)制,它并不會(huì)像 synchronized 那樣讓線程阻塞或者等待,而是保證了線程對(duì)變量的可見性——當(dāng)一個(gè)線程修改了 volatile 變量,其他線程能夠馬上看到這個(gè)修改。

示例代碼:

圖片圖片

在這個(gè)例子中,flag 被聲明為 volatile,這意味著當(dāng)一個(gè)線程修改了 flag 變量的值,其他線程能立即看到這個(gè)變化,而不需要緩存它的值。

volatile 的局限性

volatile 只保證變量的可見性,而無法保證原子性和操作的順序性。這意味著你不能僅僅依靠 volatile 來實(shí)現(xiàn)更復(fù)雜的操作,例如遞增一個(gè)計(jì)數(shù)器。如果你需要保證一個(gè)操作的原子性,volatile 并不是合適的選擇。它的作用是輕量級(jí)的同步,只適用于一些簡(jiǎn)單的場(chǎng)景,比如標(biāo)志位的修改和檢查。

第三章:CAS——鎖的優(yōu)化

餐廳的快速自助取餐

最后,我們來到了餐廳的另一種有趣的機(jī)制:自助取餐。每個(gè)顧客都可以在自己的座位上使用自助設(shè)備,快速選擇和取餐,不用等候服務(wù)員。而這項(xiàng)自助技術(shù)的關(guān)鍵在于,它能夠確保顧客在選擇餐品時(shí)不會(huì)和其他顧客發(fā)生沖突。顧客如果拿走了某個(gè)菜品,其他人就不能選擇同一個(gè)菜品。

這個(gè)故事就像Java中的 CAS(Compare-And-Swap,比較并交換)機(jī)制。CAS 是一種基于硬件支持的原子操作,它通過比較內(nèi)存中的數(shù)據(jù)和預(yù)期值是否相等,來決定是否交換數(shù)據(jù)。這種方式不需要鎖,而是通過原子性操作來保證線程安全,是一種非常高效的并發(fā)控制機(jī)制。

示例代碼:

圖片圖片

在這個(gè)例子中,AtomicInteger 類使用了 CAS 來保證對(duì) count 變量的原子操作。每次增加 count 時(shí),CAS 會(huì)檢查 count 當(dāng)前的值是否符合預(yù)期,然后執(zhí)行自增操作。這個(gè)過程是原子性的,不需要加鎖。

CAS 的優(yōu)勢(shì)和缺點(diǎn)

CAS 的優(yōu)勢(shì)在于它是一種無鎖的操作,這使得它在并發(fā)高的環(huán)境下具有非常高的性能。由于它不涉及上下文切換,因此可以減少線程間的競(jìng)爭(zhēng)。然而,CAS 也有其局限性。它只能保證單一操作的原子性,對(duì)于復(fù)雜的操作,它就不太適用了。此外,如果 CAS 操作失敗,系統(tǒng)可能會(huì)進(jìn)行重試,這會(huì)帶來一定的性能損耗,特別是在高并發(fā)場(chǎng)景下。

結(jié)語:三者的選擇與取舍

通過這場(chǎng)并發(fā)戰(zhàn)爭(zhēng)的比喻,我們已經(jīng)了解了 synchronized、volatile 和 CAS 各自的特點(diǎn)及其優(yōu)缺點(diǎn)。那么,在實(shí)際開發(fā)中,我們?cè)撊绾芜x擇它們呢?

  • synchronized:當(dāng)你需要保證一段代碼的互斥執(zhí)行,且操作較為復(fù)雜時(shí),選擇 synchronized。它的適用場(chǎng)景比較廣泛,但性能較低。
  • volatile:當(dāng)你只需要保證變量的可見性時(shí),volatile 是一種高效的解決方案。但它并不保證原子性,因此適用于標(biāo)志位等簡(jiǎn)單場(chǎng)景。
  • CAS:在高并發(fā)場(chǎng)景下,使用 CAS 來優(yōu)化性能,避免鎖帶來的性能損失。特別適用于計(jì)數(shù)器、隊(duì)列等需要頻繁修改的共享變量。
責(zé)任編輯:武曉燕 來源: 軟件求生
相關(guān)推薦

2011-12-14 11:38:42

PhoneGapJavaAndroid

2022-05-31 08:21:07

MQ使用場(chǎng)景消費(fèi)消息

2017-04-13 15:15:17

Netflix ZuuNginx性能

2017-11-20 13:54:55

FlinkStorm框架

2017-11-21 15:50:09

FlinkStorm性能

2025-04-16 08:40:00

2009-11-20 09:01:13

Ubuntu性能對(duì)比

2011-08-25 17:29:40

LUAPHPWEB

2024-01-05 08:46:50

ReactVue

2011-07-08 14:14:13

Web服務(wù)器

2013-05-06 15:41:30

Android開發(fā)資源

2013-07-18 17:22:07

Android開發(fā)資源Android開發(fā)學(xué)習(xí)Android開發(fā)

2024-10-06 12:35:50

2013-07-17 17:03:23

Ngx_luaNginx

2019-09-24 13:53:19

MySQLMySQL 8.0數(shù)據(jù)庫(kù)

2011-07-08 09:44:51

2020-03-11 10:26:51

開發(fā)者技能工具

2023-06-27 13:51:07

FPGA數(shù)據(jù)中心程序

2011-05-06 11:04:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)