JAVA之鎖-volatile

鎖是JAVA多線程關鍵,也是面試中必問的, 在此好好總結一下。面試

(先要從進程和線程提及,此處先欠下,回頭專門說一下操做系統是怎麼管理進程和線程的)編程

說到多線程就要說說JAVA的內存模型:圖片來自於網絡。數組

  Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣底層細節。此處的變量與Java編程時所說的變量不同,指包括了實例字段、靜態字段和構成數組對象的元素,可是不包括局部變量與方法參數,後者是線程私有的,不會被共享。網絡

  Java內存模型中規定了全部的變量都存儲在主內存中,每條線程還有本身的工做內存,線程的工做內存中保存了該線程使用到的變量到主內存副本拷貝,線程對變量的全部操做(讀取、賦值)都必須在工做內存中進行,而不能直接讀寫主內存中的變量。不一樣線程之間沒法直接訪問對方工做內存中的變量,線程間變量值的傳遞均須要在主內存來完成,線程、主內存和工做內存的交互關係如上圖所示。多線程

這就有一個內存可見性的概念了。 spa

   若是變量在a線程中改變了,b線程要立馬感知到,就要經過volatile關鍵字了。 其做用就是 b線程要用到此變量的時候,將本地副本拋棄掉,而後從新從主存去讀取。操作系統

  volatile 解決了線程共享變量的可見性,synchronized 也能夠作到。線程

 volatile 修飾變量 可是他解決不了原子性, 好比,volatile  int  count  ;     方法中對其   count++  , 在多個線程對其操做,最終預期值會是錯誤的。解決方法能夠加synchronized ,CAS。對象

相關文章
相關標籤/搜索