最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面試官最喜歡問的關(guān)鍵字之volatile詳解

 更新時(shí)間:2019年03月19日 15:38:08   作者:半畝方田  
這篇文章主要給大家介紹了關(guān)于Java面試官最喜歡問的關(guān)鍵字之volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

筆者去年面試過幾家公司,基本上每家公司都會問到volatile,甚至有的公司每輪面試的時(shí)候都會問到。面試官這么喜歡問volatile就是因?yàn)檫@個(gè)關(guān)鍵字涉及到的知識點(diǎn)較多比如Java內(nèi)存模型、內(nèi)存屏障、happen-befor等知識,可以繼續(xù)挖掘到系統(tǒng)指令、超線程等知識。

Java內(nèi)存模型(JMM)

volatile是Java虛擬機(jī)提供的最輕量的同步機(jī)制,但很難被正確的理解與使用,通過學(xué)習(xí)Java內(nèi)存模型對volatile專門定義的一些特殊訪問規(guī)則,或許會對理解volatile有一定幫助。

Java內(nèi)存模型定義了線程和內(nèi)存之間關(guān)系:線程之間的共享變量存儲在主內(nèi)存中,每個(gè)線程都有一個(gè)私有的本地內(nèi)存,本地內(nèi)存中存儲了該線程以讀 / 寫共享變量的副本。本地內(nèi)存是 JMM 的一個(gè)抽象概念,并不真實(shí)存在;它涵蓋內(nèi)存、緩存、寄存器以及其他的硬件和編譯器優(yōu)化。Java的內(nèi)存模型抽象如下:

volatile的語義

volatile主要提供了兩種語義:

1,可見性:

可見性是指一個(gè)線程寫入的值,其他線程能夠立即讀取。在由Java內(nèi)存模型可知道,每個(gè)線程都是有本地內(nèi)存。所以線程A寫入在正常情況下,線程B不能立即讀取。但是在volatile變量,可以保證線程A不寫入本地內(nèi)存直接寫入主內(nèi)存,線程B直接從主內(nèi)存中讀取,不從本地內(nèi)存中讀取。

2,禁止指令重排序:

重排序是指編譯器和處理器為了優(yōu)化程序性能而對指令進(jìn)行重排序的一種優(yōu)化手段。

Java程序的幾種重排序

  • 編譯器優(yōu)化重排序:編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執(zhí)行順序。
  • 指令級并行的重排序:如果不存在數(shù)據(jù)依賴性,處理器可以改變語句對應(yīng)機(jī)器指令的執(zhí)行順序。
  • 內(nèi)存系統(tǒng)的重排序:處理器使用緩存和讀寫緩沖區(qū),這使得加載和存儲操作看上去可能是在亂序執(zhí)行

volatile的技術(shù)基石--內(nèi)存屏障

內(nèi)存屏障是cpu指令,該指令保證特定操作的順序性和某些內(nèi)存的可見性。插入一條內(nèi)存屏障指令之后會告訴編譯器和CPU:不管什么指令都不能和這條指令重排序。內(nèi)存屏障所做的另外一件事情就是強(qiáng)制刷出各種CPU cache,如一個(gè)Write-Barrier(寫入屏障)將刷出所有在Barrier之前寫入cache的數(shù)據(jù),因此,任何CPU上的線程都能讀取到這些數(shù)據(jù)的最新版本。

對于Java程序而言,如果把加入volatile關(guān)鍵字的代碼和未加入volatile關(guān)鍵字的代碼都生成匯編代碼,會發(fā)現(xiàn)加入volatile關(guān)鍵字的代碼會多出一個(gè)lock前綴指令。

volatile的典型用例

狀態(tài)標(biāo)志,代碼示例如下:


線程1執(zhí)行run()的過程中,可能有另外的線程2調(diào)用了shutdown,所以stop變量必須是volatile(利用的volatile的可見性)。

還有一種常見的用法在雙重檢驗(yàn)的單例實(shí)現(xiàn)上,代碼如下:

instance = new Singleton()這句,這并非是一個(gè)原子操作,事實(shí)上在 JVM 中這句話大概做了下面 3 件事情:

  • 給 instance 分配內(nèi)存
  • 調(diào)用 Singleton 的構(gòu)造函數(shù)來初始化成員變量
  • 將instance對象指向分配的內(nèi)存空間(執(zhí)行完這步 instance 就為非 null 了)

如果instance變量沒有加volatile,因?yàn)橹噶钪嘏判虻拇嬖?,就可能?dǎo)致執(zhí)行步驟是1-2-3,也可能是1-3-2。一旦是1-3-2,就可能會導(dǎo)致訪問未初始化的內(nèi)存。但是加上volatile關(guān)鍵字之后,一定保證是按照1-2-3步驟執(zhí)行的(利用的volatile的禁止重排序)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Spring注解Autowired的底層實(shí)現(xiàn)原理詳解

    Spring注解Autowired的底層實(shí)現(xiàn)原理詳解

    從當(dāng)前springboot的火熱程度來看,java?config的應(yīng)用是越來越廣泛了,在使用java?config的過程當(dāng)中,我們不可避免的會有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來聊聊Autowired的底層實(shí)現(xiàn)原理
    2022-10-10
  • Java將word文件轉(zhuǎn)成pdf文件的操作方法

    Java將word文件轉(zhuǎn)成pdf文件的操作方法

    這篇文章主要介紹了Java將word文件轉(zhuǎn)成pdf文件的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • SpringCloud微服務(wù)中跨域配置的方法詳解

    SpringCloud微服務(wù)中跨域配置的方法詳解

    在使用SpringCloud實(shí)現(xiàn)微服務(wù)時(shí),經(jīng)常會碰到前端頁面訪問多個(gè)二級域名的情況,跨域是首先要解決的問題。解決這個(gè)問題,可以從兩方面入手,一種方案是在微服務(wù)各自的業(yè)務(wù)模塊中實(shí)現(xiàn),即在SpringBoot層實(shí)現(xiàn),另外一種方案就是在Gateway層實(shí)現(xiàn)
    2023-02-02
  • idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案

    idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案

    這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 一文詳細(xì)springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫的整合步驟

    一文詳細(xì)springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫的整合步驟

    Spring Boot可以很方便地與MySQL數(shù)據(jù)庫進(jìn)行整合,下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫的整合步驟,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過程解析

    springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過程解析

    這篇文章主要介紹了springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot中的404錯(cuò)誤:原因、影響及解決策略

    SpringBoot中的404錯(cuò)誤:原因、影響及解決策略

    本文詳細(xì)介紹了SpringBoot中404錯(cuò)誤的出現(xiàn)原因、影響以及處理策略,404錯(cuò)誤常見于URL路徑錯(cuò)誤、控制器配置問題、靜態(tài)資源配置錯(cuò)誤、依賴缺失或版本不兼容、配置錯(cuò)誤和服務(wù)器配置問題,解決方法包括檢查URL路徑、審查控制器配置、配置靜態(tài)資源
    2025-02-02
  • 使用jxls自定義命令設(shè)置動態(tài)行高

    使用jxls自定義命令設(shè)置動態(tài)行高

    這篇文章主要介紹了使用jxls自定義命令設(shè)置動態(tài)行高,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java垃圾回收finalize()作用詳解

    Java垃圾回收finalize()作用詳解

    這篇文章主要為大家詳細(xì)介紹了Java垃圾回收finalize()作用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • Java的Synchronized關(guān)鍵字學(xué)習(xí)指南(全面 & 詳細(xì))

    Java的Synchronized關(guān)鍵字學(xué)習(xí)指南(全面 & 詳細(xì))

    這篇文章主要給大家介紹了關(guān)于Java的Synchronized關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

塘沽区| 且末县| 德保县| 江陵县| 赤城县| 浮山县| 永仁县| 昌乐县| 阜平县| 禄丰县| 湟中县| 曲周县| 太和县| 双江| 河南省| 兴安盟| 内黄县| 太白县| 沽源县| 贵南县| 册亨县| 措勤县| 巴马| 新闻| 苏尼特右旗| 巴彦县| 盘锦市| 榆社县| 手游| 汶上县| 临颍县| 高唐县| 盐池县| 腾冲县| 红原县| 监利县| 荔波县| 乐安县| 福安市| 东乡族自治县| 民县|