volatile和synchronized的區(qū)別

volatile

volatile保證了多線程之間的可見性。用volatile修飾的變量,在多個線程中都可以讀到最新的值,但是不保證變量的原子性。
那么volatile如何保證多線程之間的可見性呢?
首先,需要說明下線程安全問題引起的原因。每個線程在計算的時候會讀取主內(nèi)存中的數(shù)據(jù)到本地變量表中,計算后再將數(shù)據(jù)寫回到主內(nèi)存中。假設(shè),每個線程讀取到的主內(nèi)存中的數(shù)據(jù)的值是一致的,在各自線程內(nèi)存中計算后,會得到不同的結(jié)果,這個時候再講結(jié)果會寫到主內(nèi)存中,那么先寫回主內(nèi)存中的線程的計算過程就被覆蓋掉了。這樣就造成了線程安全問題。
被volatile修飾的變量,對于虛擬機來說就是被共享的變量,所以不會在該變量上進行指令的重排序,也不會在線程內(nèi)存中緩存該變量,直接在主內(nèi)存中存取,所以保證了每個線程讀取到的數(shù)據(jù)都是最新的。

synchronized

synchronized關(guān)鍵字可以修飾代碼塊、方法、靜態(tài)方法以及類。用sysnchronized時要注意鎖定的是對象還是類,如果鎖定的是類,相當于鎖定了該類的所有對象。
synchronized修飾的方法或者代碼塊,使該方法和代碼塊對多線程互斥,只有一個線程可以進入該方法或者代碼塊(方法或者代碼塊以下統(tǒng)稱為方法,便于說明)。多個線程訪問synchronized修飾的方法時,會嘗試獲取對象的mointor鎖,當獲取到mointor時可以進入該同步方法進行運算,沒有獲取到mointor鎖的線程會存在虛擬機的一個synchronized的隊列中,當mointor被釋放的時候,從synchronized隊列中出一個線程獲取mointor鎖

圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • volatile和synchronized特點 首先需要理解線程安全的兩個方面:執(zhí)行控制和內(nèi)存可見。 執(zhí)行控制的目...
    第六象限閱讀 507評論 0 0
  • 文章參考自:鏈接 volatile 和 synchronized 特點 首先需要理解線程安全的兩個方面:執(zhí)行控制和...
    wangzaiplus閱讀 293評論 0 1
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,819評論 11 349
  • 孤獨的城市真的太會偽裝 一個擁抱都比一個吻漫長 站在十字路口的我 猜不透你想要前往何方 路上的行人匆匆忙忙 不斷從...
    榆城下的光閱讀 497評論 2 8
  • 我?guī)еS多執(zhí)念和欲望像拼命三郎一樣想追求我所愛的生活?,F(xiàn)實是什么?我只像一直若無其事緩慢的蝸牛,我曾問自己:“自由...
    南方姑娘o閱讀 496評論 0 1

友情鏈接更多精彩內(nèi)容