volatitle 和多線程開發

來源:互聯網
上載者:User

 

C/C++中:

編譯器在編譯器的時候會對程式指令做一些最佳化,如改變一些指令的執行順序,或者把變數的值拷貝到寄存器中,然後在接下來的使用中從寄存器中快速的取得該值。


然而這些最佳化行為有可能在多線程環境中造成臨界區資料競賽,想象一下兩個線程A,B都在訪問一個變數C,當A在訪問變數C時,編譯器做了最佳化,將C的值拷貝到了寄存器中已備告訴訪問,問題來了,如果B改變了C變數的值,而A訪問的依舊是緩衝的值,就有可能造成資料的不一致。
volatile修飾符告訴編譯器不要對此變數進行任何最佳化操作,但這並不足以同步線程,因為他缺少原子性和順序性的語義。例如i++操作,其實是有三個操作組成的,首先從記憶體中將值載入到寄存器中,然後將值加1,再寫到寄存器中,因為volatile並沒有原子性的語義,所以用volatile聲明的變數i,仍然面臨多線程環境下的資料不一致問題。
volatile沒有順序性的語句,所以他申明的變數設計的操作有可能被重新排列執行順序以增加效能,這樣容易引起資料競賽。
Java:Java中的volatile相比c、c++要強大,在1.5以後加入了不完全的順序語義:1.在讀取volatile變數時,讀取操作之後的操作必須在當前讀取操作完成之後才能執行。2.在寫volatile變數時,在這個操作之前的操作必須限執行完畢以後,本操作才能執行。
這個不完全的順序語義,可以讓java中volatile變數用來做多線程建的狀態標記。
C#與Java類似。
綜上所述,volatitle 線上程同步方面比較弱。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.