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

一篇文章徹底搞懂Synchronized 和 Volatile,看完漲薪50%!

開(kāi)發(fā) 前端
小米是一家互聯(lián)網(wǎng)大廠的Java開(kāi)發(fā)工程師,最近在準(zhǔn)備面試題。他的朋友小明在另一家公司面試Java后端工程師,面試回來(lái)一臉生無(wú)可戀:“面試官上來(lái)就問(wèn) synchronized 和 volatile 的區(qū)別,我結(jié)巴了半天,最后被懟得體無(wú)完膚!”

故事背景

小米是一家互聯(lián)網(wǎng)大廠的Java開(kāi)發(fā)工程師,最近在準(zhǔn)備面試題。他的朋友小明在另一家公司面試Java后端工程師,面試回來(lái)一臉生無(wú)可戀:“面試官上來(lái)就問(wèn) synchronized 和 volatile 的區(qū)別,我結(jié)巴了半天,最后被懟得體無(wú)完膚!” 小米哈哈大笑:“這個(gè)問(wèn)題很好回答啊,我來(lái)給你講講?!?于是,一場(chǎng)關(guān)于 Java 并發(fā)的討論就此展開(kāi)……

圖片圖片

synchronized 和 volatile 的基本概念

小米清了清嗓子,開(kāi)始講解:

“我們寫(xiě) Java 代碼時(shí),多線程編程是繞不開(kāi)的一個(gè)話(huà)題,而 synchronized 和 volatile 這兩個(gè)關(guān)鍵字,都是 Java 提供的線程同步手段?!?/p>

1、synchronized:獨(dú)占鎖,保證原子性和可見(jiàn)性

  • synchronized 是 Java 提供的關(guān)鍵字,它表示只有一個(gè)線程可以獲取作用對(duì)象的鎖,進(jìn)入同步代碼塊,其他線程必須等待。
  • 這樣可以防止多個(gè)線程并發(fā)修改共享資源,保證變量的可見(jiàn)性和原子性,防止線程安全問(wèn)題。

2、volatile:內(nèi)存可見(jiàn)性,防止指令重排序

volatile 關(guān)鍵字用于修飾變量,它告訴 CPU 和編譯器:

  • 這個(gè)變量不能被緩存,必須從主存(內(nèi)存)中讀取。
  • 禁止指令重排序,防止CPU對(duì)代碼執(zhí)行順序進(jìn)行優(yōu)化,導(dǎo)致多線程環(huán)境下的程序異常。

小明點(diǎn)點(diǎn)頭:“聽(tīng)起來(lái)好像都能用來(lái)解決并發(fā)問(wèn)題???它們的區(qū)別到底在哪?”

synchronized 和 volatile 的核心區(qū)別

小米笑著說(shuō):“這正是面試官的坑點(diǎn)!雖然它們都跟線程安全有關(guān),但作用完全不同?!?/p>

1、修飾對(duì)象的范圍不同

圖片

小米舉例:“比如你有一個(gè) count 變量,你可以用 volatile 讓它的修改對(duì)所有線程可見(jiàn)。但如果你要保證 count++ 這個(gè)操作的原子性,那 volatile 就不行了,必須用 synchronized?!?/p>

2、是否保證原子性

圖片

小明皺眉:“等等,那如果 volatile 不能保證原子性,它的用武之地在哪?”

小米解釋?zhuān)骸皏olatile 適用于單一變量的狀態(tài)標(biāo)記,比如雙重檢查鎖(DCL)模式下的 instance 變量,或者是 boolean flag 這樣的簡(jiǎn)單開(kāi)關(guān)變量。而 synchronized 適用于復(fù)雜邏輯操作,比如 count++ 這種需要原子性保護(hù)的操作?!?/p>

synchronized 和 volatile 的其他區(qū)別

小米繼續(xù)深入講解:

1、是否會(huì)造成線程阻塞

圖片圖片

2、是否會(huì)被編譯器優(yōu)化

圖片圖片

小明驚訝:“原來(lái) Java 還這么智能,synchronized 還能被優(yōu)化?”

小米點(diǎn)頭:“對(duì)的!Java 1.6 以后,synchronized 進(jìn)行了很多優(yōu)化,比如:

  • 偏向鎖:如果一個(gè)線程一直在使用同一個(gè)鎖,JVM 就不會(huì)頻繁地加鎖和釋放鎖。
  • 輕量級(jí)鎖:多個(gè)線程嘗試競(jìng)爭(zhēng)鎖時(shí),不會(huì)立即進(jìn)入阻塞狀態(tài),而是使用 CAS 方式嘗試加鎖,提高性能。
  • 鎖消除、鎖膨脹:JVM 會(huì)根據(jù)實(shí)際情況優(yōu)化鎖的使用。”

面試中如何回答 synchronized 和 volatile 的區(qū)別

小米總結(jié)了一套“黃金答題模板”:

“如果面試官問(wèn) synchronized 和 volatile 的區(qū)別,你可以這么答:

  • volatile只能修飾變量,synchronized 既能修飾變量,也能修飾方法和代碼塊。
  • volatile保證變量的可見(jiàn)性,但不保證原子性;synchronized同時(shí)保證可見(jiàn)性和原子性。
  • volatile不會(huì)造成線程阻塞,而 synchronized 可能會(huì)導(dǎo)致線程阻塞。
  • volatile不能被編譯器優(yōu)化,而 synchronized 通過(guò) JVM 的優(yōu)化(如偏向鎖、輕量級(jí)鎖)能提高性能。
  • volatile 適用于狀態(tài)標(biāo)記等簡(jiǎn)單場(chǎng)景,而 synchronized 適用于臨界區(qū)保護(hù)、多個(gè)操作組合的場(chǎng)景?!?/li>

小明眼睛一亮:“聽(tīng)你這么一說(shuō),我感覺(jué)能答出個(gè)八九不離十了!”

真實(shí)場(chǎng)景下的選擇

小米最后補(bǔ)充道:“不過(guò),面試官可能還會(huì)問(wèn)你——在真實(shí)項(xiàng)目中該怎么選? 你可以告訴他:”

  • 如果只是想讓變量的修改對(duì)所有線程可見(jiàn),且不涉及復(fù)合操作(如count++),可以用 volatile。
  • 如果需要保證線程安全,操作需要原子性,那就用 synchronized(或者 Lock 機(jī)制)。
  • 如果涉及高并發(fā),還可以考慮 ReentrantLock,它比 synchronized 更靈活。

面試官的 “坑” 及應(yīng)對(duì)

小米最后提醒:“面試官喜歡挖坑,比如問(wèn)你:”

1、volatile 適用于哪些場(chǎng)景?

  • 適用于狀態(tài)標(biāo)記(比如 boolean flag),單例模式的雙重檢查鎖(DCL)。

2、為什么 volatile 不能保證原子性?

  • 因?yàn)?volatile 只是保證了線程可見(jiàn)性,但 count++ 這樣的操作是 讀取-計(jì)算-寫(xiě)入,中間有多個(gè)步驟,volatile 無(wú)法保證其不被其他線程干擾。

3、為什么 synchronized 能保證原子性?

  • 因?yàn)?synchronized 會(huì)讓線程獨(dú)占鎖,保證操作的完整性,其他線程必須等待鎖釋放。
責(zé)任編輯:武曉燕 來(lái)源: 軟件求生
相關(guān)推薦

2017-07-20 16:55:56

Android事件響應(yīng)View源碼分析

2019-07-23 08:55:46

Base64編碼底層

2024-06-25 08:18:55

2020-06-03 11:06:26

DNS域名緩存

2013-04-15 10:59:08

iOS開(kāi)發(fā)ARC版本說(shuō)明

2024-05-10 08:19:59

arthasjava字節(jié)碼

2019-08-13 09:00:01

內(nèi)網(wǎng)外網(wǎng)通信

2021-08-02 10:01:09

Iterator接口Java項(xiàng)目開(kāi)發(fā)

2021-05-18 09:00:28

Python類(lèi)class

2024-10-23 16:02:40

JavaScriptPromiserejection

2021-05-21 09:01:56

Python繼承多態(tài)

2021-08-17 09:55:05

JavaScript MicrotaskPromise

2021-08-30 10:01:01

Map接口HashMap

2021-05-27 09:01:14

Python文件讀寫(xiě)Python基礎(chǔ)

2021-03-08 09:15:46

日志Filebeat運(yùn)維

2023-11-01 15:52:35

2020-07-28 17:27:53

Nginx 負(fù)載均衡模塊

2020-06-23 16:28:25

Nginx負(fù)載均衡服務(wù)器

2020-10-09 08:15:11

JsBridge

2025-01-26 15:38:11

Spring事務(wù)編程式
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲第一区国产精品 | 毛片视频免费观看 | 7777精品伊人久久精品影视 | 午夜在线小视频 | 亚洲激情一级片 | 日日天天 | 亚洲欧美日韩精品久久亚洲区 | 日本不卡一区二区三区 | 中文字幕在线观 | 日韩国产精品一区二区三区 | wwwxx在线观看| 久干网| 黑人久久久 | 成人午夜网| 成人免费福利 | 精品国产免费一区二区三区五区 | 欧美成人a∨高清免费观看 91伊人 | 亚洲精品久久久蜜桃 | 国产成人99久久亚洲综合精品 | 国产乱码高清区二区三区在线 | 成人激情视频 | 久久久国产精品一区 | 成人精品毛片国产亚洲av十九禁 | 黑色丝袜三级在线播放 | 亚洲第一成人av | 久久久久一区二区 | 欧美国产日韩一区 | 久草中文在线 | 久久精品国产亚洲 | 91久久看片| 亚洲va欧美va人人爽午夜 | 岛国av免费观看 | 日韩欧美三区 | 四虎影视1304t | 国产一在线观看 | 日本三级在线 | 中文字幕日韩欧美一区二区三区 | 羞羞视频免费在线观看 | 一区二区三区视频免费观看 | 黄色网址在线免费播放 | 色婷婷在线视频 |