【Java知識點專項練習】之 volatile 關鍵字的功能

來源:互聯網
上載者:User

標籤:功能   練習   解決   因此   完全   單線程   訪問   編譯器   程式   

volatile是java中的一個類型修飾符。它是被設計用來修飾被不同線程訪問和修改的變數。如果不加入volatile,基本上會導致這樣的結果:要麼無法編寫多線程程式,要麼編譯器 失去大量最佳化的機會。

  • 1,可見度

? ? 可見度指的是在一個線程中對該變數的修改會馬上由工作記憶體(Work Memory)寫回主記憶體(Main Memory),所以會馬上反應在其它線程的讀取操作中。順便一提,工作記憶體和主記憶體可以近似理解為實際電腦中的快取和主存,工作記憶體是線程獨享的,主存是線程共用的。

  • 2,禁止指令重排序最佳化

? ? 禁止指令重排序最佳化。大家知道我們寫的代碼(尤其是多線程代碼),由於編譯器最佳化,在實際執行的時候可能與我們編寫的順序不同。編譯器只保證程式執行結果與原始碼相同,卻不保證實際指令的順序與原始碼相同。這在單線程看起來沒什麼問題,然而一旦引入多線程,這種亂序就可能導致嚴重問題。volatile關鍵字就可以從語義上解決這個問題。

? ? 注意,禁止指令重排最佳化這條語義直到jdk1.5以後才能正確工作。此前的JDK中即使將變數聲明為volatile也無法完全避免重排序所導致的問題。所以,在jdk1.5版本前,雙重檢查鎖形式的單例模式是無法保證安全執行緒的。因此,下面的單例模式的代碼,在JDK1.5之前是不能保證安全執行緒的。

【Java知識點專項練習】之 volatile 關鍵字的功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.