自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

引言

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

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

圖片圖片

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

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

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

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

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

餐廳的隊伍管理

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

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

示例代碼:

圖片圖片

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

鎖的代價

然而,synchronized 的缺點也非常明顯——它的性能開銷較大。因為它是通過操作系統(tǒng)提供的鎖機制來進行線程同步的,每當(dāng)一個線程獲取鎖時,其他線程必須等待,這樣就會導(dǎo)致上下文切換,性能上會有損耗。如果頻繁的獲取和釋放鎖,可能會導(dǎo)致系統(tǒng)的吞吐量降低。

第二章:volatile——輕量級的線程間共享

餐廳的公告板

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

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

示例代碼:

圖片圖片

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

volatile 的局限性

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

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

餐廳的快速自助取餐

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

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

示例代碼:

圖片圖片

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

CAS 的優(yōu)勢和缺點

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

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

通過這場并發(fā)戰(zhàn)爭的比喻,我們已經(jīng)了解了 synchronized、volatile 和 CAS 各自的特點及其優(yōu)缺點。那么,在實際開發(fā)中,我們該如何選擇它們呢?

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

2011-12-14 11:38:42

PhoneGapJavaAndroid

2022-05-31 08:21:07

MQ使用場景消費消息

2017-04-13 15:15:17

Netflix ZuuNginx性能

2017-11-20 13:54:55

FlinkStorm框架

2017-11-21 15:50:09

FlinkStorm性能

2009-11-20 09:01:13

Ubuntu性能對比

2025-04-16 08:40:00

2011-08-25 17:29:40

LUAPHPWEB

2024-01-05 08:46:50

ReactVue

2011-07-08 14:14:13

Web服務(wù)器

2013-07-18 17:22:07

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

2013-05-06 15:41:30

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ù)庫

2023-06-27 13:51:07

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

2020-11-02 08:54:29

JMMVolatileSynchronize

2019-10-25 10:35:49

Java用法場景

2010-07-14 17:32:53

SQL Server

2011-05-06 11:04:37

點贊
收藏

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