每日一面——沒用過volatile關鍵字?感謝你參加這次面試

菜雞每日一面系列打卡14

每天一道面試題目 

助力小夥伴輕鬆拿offer

堅持就是勝利,我們一起努力!

題目描述

談談你對volatile關鍵字的理解。

題目分析

在Java面試中,尤其是有關多線程方面知識的考查,volatile關鍵字只會遲到,不會缺席。對volatile關鍵字的理解,不僅是對多線程編程實踐的考查,更要求對程序執行過程和原理的把握。volatile是JVM提供的最輕量級的同步機制,但由於其不容易被正確、完整的理解,在實際工作中,很多程序員都會繞道而行。因此,在面試過程中也很容易載跟頭。不僅如此,全面瞭解volatile關鍵字,對理解多線程操作很有幫助。接下來,隨菜雞一起去看看吧。

題目解答

開宗明義,volatile關鍵字的作用主要有兩個:可見性與禁止指令重排序優化。但僅僅這樣回答顯然不能滿足面試官的要求,還需要闡述個人理解和一些細節上的說明

  • 可見性,保證被volatile關鍵字修飾的變量(以下簡稱volatile變量)對所有線程可見。從邏輯上看,volatile變量對所有線程是立即可見的,也就是說,對volatile變量的寫操作會立刻反映到其他線程當中。

    爲什麼強調是從邏輯上看呢?因爲,從物理存儲角度看,各個線程的工作內存中volatile變量可以不一致,但每次使用之前都會進行刷新,因此,邏輯上是一致的。volatile的特殊規則保證了新值能立即同步到主內存,並且storewrite操作是連續的,每次使用前立即從主內存刷新,並且readload操作是連續的。

    但這並不意味着,使用volatile變量能保證線程安全。衆所周知(其實也不一定),Java中的運算操作符並非原子操作,因此,volatile變量的運算並不是線程安全的。最常見的例子便是形如i++的自增運算。

public class IncreaseTest {


    public static volatile int i = 0;
    
    // 非線程安全,因爲自增運算不是原子操作
    public static void increase() {
        i++;    
    }
    
}

        

  • 禁止指令重排序優化,防止機器級別的指令重排序優化造成併發編程中的錯誤。什麼是指令重排序呢?指令重排序就是處理器在保證程序能得出正確的執行結果的前提下,允許指令執行順序的改變。這是基於優化提高效率的考慮。而在併發編程情況下,這種優化很容易是自作聰明的表現,導致一系列難以排查的問題。在《深入理解Java虛擬機》一書中,周志明老師用單例懶漢式實現的彙編代碼進行了舉例,說明了volatile關鍵字通過在指令中添加內存屏障的方式禁止了指令重排序,菜雞在這裏要說明兩點:

        

    • volatile關鍵字主要是爲了在instance變量被初始化爲Singleton實例時,避免指令重排序導致的多線程不能正確處理instance變量,而由第一條可知,由於volatile的可見性,在instance變量初始化完成之後,立刻反映到其他線程當中,也就可以一定程度上避免新加入的線程對鎖的競爭。

    • 書中對於單例的懶漢式實現出現了一些小失誤,並未給出私有的構造方法,菜雞對這段代碼進行了補全如下。

            

public class Singleton {


    private volatile static Singleton instance;
    
    // 私有構造方法
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    
}

        

以上便是菜雞關於volatile關鍵字的一些理解,供大家參考。

其他說明

由於微信公衆號的頁面模板功能的限制,一個頁面模板僅支持保存30篇文章,由於每日一題系列更新已經超過了30篇,因此,菜雞將其全部歸類到每日一題專輯中,在每日一題欄目中僅保存最近更新的30篇,需要翻看歷史文章的,可以點擊文章頂部的專輯進行查看,其餘欄目也可採用該方式查看。如下圖所示????。

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章