中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

synchronized和volatile關鍵字的作用是什么

發布時間:2021-07-23 15:44:40 來源:億速云 閱讀:157 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關synchronized和volatile關鍵字的作用是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1. 一個被volatile聲明的變量主要有以下兩種特性保證保證線程安全:

  1. 可見性。

  2. 有序性。

2. 在滿足以下兩個條件的情況下,volatile就能保證變量的線程安全問題:

  1. 運算結果并不依賴變量的當前值,或者能夠確保只有單一的線程修改變量的值。

  2. 變量面試中面試官經常會說:“單例模式了解嗎?來給我手寫一下!給我解釋一下雙重檢驗鎖方式實現單例模式的原理唄!”

3.雙重校驗鎖實現對象單例(線程安全)

public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
       //先判斷對象是否已經實例過,沒有實例化過才進入加鎖代碼
        if (uniqueInstance == null) {
            //類對象加鎖
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

另外,需要注意 uniqueInstance 采用 volatile 關鍵字修飾也是很有必要。 uniqueInstance 采用 volatile 關鍵字修飾也是很有必要的, uniqueInstance = new Singleton(); 這段代碼其實是分為三步執行:

  1. 為 uniqueInstance 分配內存空間

  2. 初始化 uniqueInstance

  3. 將 uniqueInstance 指向分配的內存地址 但是由于 JVM 具有指令重排的特性,執行順序有可能變成 1->3->2。指令重排在單線程環境下不會出現問題,但是在多線程環境下會導致一個線程獲得還沒有初始化的實例。例如,線程 T1 執行了 1 和 3,此時 T2 調用 getUniqueInstance() 后發現 uniqueInstance 不為空,因此返回 uniqueInstance,但此時 uniqueInstance 還未被初始化。 使用 volatile 可以禁止 JVM 的指令重排,保證在多線程環境下也能正常運行。

以上就是synchronized和volatile關鍵字的作用是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

于田县| 丹巴县| 大理市| 晴隆县| 苏尼特左旗| 宁都县| 读书| 什邡市| 南丰县| 明光市| 枣强县| 错那县| 乾安县| 龙口市| 格尔木市| 安溪县| 贞丰县| 崇文区| 许昌市| 积石山| 方城县| 达孜县| 四子王旗| 万源市| 汉中市| 柳林县| 河北省| 临江市| 伊春市| 阳泉市| 法库县| 锡林浩特市| 赣榆县| 闸北区| 开鲁县| 都兰县| 苍溪县| 汝城县| 锦州市| 皮山县| 平和县|