線程和進程的區別
java
可見性
一個線程對共享變量值的修改,可以及時的被其餘線程看到。
共享變量
若是一個變量在多個線程的工做內存中都存在副本,那麼這個變量就是這幾個線程的共享變量。
java內存模型
Java memory model 描述了java程序中各類變量(線程共享變量)的訪問規則,
以及在JVM中將變量存儲到內存,以及從內存中讀取變量的底層細節。性能
全部的變量都存儲在主內存中
每一個線程都有本身獨立的工做內存,裏面保存了該線程使用到的變量副本(主內存中該變量的一個拷貝)優化
線程對共享變量的全部的操做都必須在本身的工做內存中進行,不能直接從主內存中讀取spa
不一樣線程之間沒法直接訪問其餘線程工做內存中的變量,線程間變量值的傳遞須要經過住內存來完成。
線程1對共享變量的修改要想被線程2及時的看到,必需要通過2個步驟:
把工做內存1中更新過的共享變量刷新到主內存中。
將主內存中最新的共享變量的值更新到工做內存2中線程
可見性的實現方式:
synchronized
原子性(同步)
可見性
JMM關於synchronized的兩條規定
解鎖以前,必須把共享變量的最新值刷新到主內存中
線程加鎖時,將清空工做內存中共享變量的值,從而使用共享變量時須要從主內存中從新讀取最新值(枷鎖和解鎖須要是同一把鎖)blog
線程解鎖前對共享變量的修改在下次加鎖的時候對其餘線程可見。排序
線程執行互斥代碼的過程:
1,得到互斥鎖
2,清空工做內存
3,從主內存拷貝變量的最新副本到工做內存
4,執行代碼
5,將更改後的共享變量值刷新到主內存
6,釋放互斥鎖
重排序
代碼書寫的順序與實際執行的順序不一樣,指令重排序是編譯器或是處理器爲提升程序的性能而作的優化
1,編譯器優化的重排序(編譯器優化)
2,指令級並行重排序(處理器優化)
3,內存系統重排序(處理器優化)進程
as-if-serial:不管如何重排序,程序執行的結果應該與代碼順序執行的結果一致
volatile圖片