日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中volatile的用法

發(fā)布時間:2025/4/16 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中volatile的用法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變量修飾符,而synchronized則作用于一段代碼或方法;看如下三句get代碼:

  • int?i1;??????????????int?geti1()?{return?i1;}
  • volatile?int?i2;??int?geti2()?{return?i2;}
  • int?i3;??????????????synchronized?int?geti3()?{return?i3;}
  •   geti1()得到存儲在當前線程中i1的數(shù)值。多個線程有多個i1變量拷貝,而且這些i1之間可以互不相同。換句話說,另一個線程可能已經(jīng)改 變了它線程內(nèi)的i1值,而這個值可以和當前線程中的i1值不相同。

    事實上,Java有個思想叫“主”內(nèi)存區(qū)域,這里存放了變量目前的“準確值”。每個線程 可以有它自己的變量拷貝,而這個變量拷貝值可以和“主”內(nèi)存區(qū)域里存放的不同。

    因此實際上存在一種可能:“主”內(nèi)存區(qū)域里的i1值是1,線程1里的i1值 是2,線程2里的i1值是3——這在線程1和線程2都改變了它們各自的i1值,而且這個改變還沒來得及傳遞給“主”內(nèi)存區(qū)域或其他線程時就會發(fā)生。
       而geti2()得到的是“主”內(nèi)存區(qū)域的i2數(shù)值。用volatile修飾后的變量不允許有不同于“主”內(nèi)存區(qū)域的變量拷貝。換句話說,一個變量經(jīng) volatile修飾后在所有線程中必須是同步的;

    任何線程中改變了它的值,所有其他線程立即獲取到了相同的值。理所當然的,volatile修飾的變量 存取時比一般變量消耗的資源要多一點,因為線程有它自己的變量拷貝更為高效。
      既然volatile關(guān)鍵字已經(jīng)實現(xiàn)了線程間數(shù)據(jù)同步,又要 synchronized干什么呢?呵呵,它們之間有兩點不同。首先,synchronized獲得并釋放監(jiān)視器——如果兩個線程使用了同一個對象鎖,

    監(jiān)視器能強制保證代碼塊同時只被一個線程所執(zhí)行——這是眾所周知的事實。但是,synchronized也同步內(nèi)存:事實上,synchronized在“ 主”內(nèi)存區(qū)域同步整個線程的內(nèi)存。因此,執(zhí)行g(shù)eti3()方法做了如下幾步:
    1. 線程請求獲得監(jiān)視this對象的對象鎖(假設(shè)未被鎖,否則線程等待直到鎖釋放)
    2. 線程內(nèi)存的數(shù)據(jù)被消除,從“主”內(nèi)存區(qū)域中讀入(Java虛擬機能優(yōu)化此步。。。[后面的不知道怎么表達,汗])
    3. 代碼塊被執(zhí)行
    4. 對于變量的任何改變現(xiàn)在可以安全地寫到“主”內(nèi)存區(qū)域中(不過geti3()方法不會改變變量值)
    5. 線程釋放監(jiān)視this對象的對象鎖
      因此volatile只是在線程內(nèi)存和“主”內(nèi)存間同步某個變量的值,而synchronized通過鎖定和解鎖某個監(jiān)視器同步所有變量的值。顯然synchronized要比volatile消耗更多資源。

    ?更通俗的解釋:

    Volatile?字面的意思時易變的,不穩(wěn)定的。在C#中也差不多可以這樣理解。

    編譯器在優(yōu)化代碼時,可能會把經(jīng)常用到的代碼存在Cache里面,然后下一次調(diào)用就直接讀取Cache而不是內(nèi)存,這樣就大大提高了效率。但是問題也隨之而來了。

    在多線程程序中,如果把一個變量放入Cache后,又有其他線程改變了變量的值,那么本線程是無法知道這個變化的。它可能會直接讀Cache里的數(shù)據(jù)。但是很不幸,Cache里的數(shù)據(jù)已經(jīng)過期了,讀出來的是不合時宜的臟數(shù)據(jù)。這時就會出現(xiàn)bug。

    用Volatile聲明變量可以解決這個問題。用Volatile聲明的變量就相當于告訴編譯器,我不要把這個變量寫Cache,因為這個變量是可能發(fā)生改變的。

    原文地址:http://www.cnblogs.com/gjhjoy/p/3556709.html

    轉(zhuǎn)載于:https://www.cnblogs.com/1175429393wljblog/p/9791876.html

    總結(jié)

    以上是生活随笔為你收集整理的C#中volatile的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。