首先我們先看一下每個線程對應我們內存的模型。
每個線程都有一個私有的本地內存,存儲共享變量的副本,從主內存獲取到數據。
線程A和線程B通信的過程是線程A把本地內存的數據同步到主內存中,線程B在從主內存中獲取到共享變量刷新到本地內存中。
主內存中有一個共享變量 x=0,線程A想把x=0>---->x=1,首先本地內存中修改x=1然後同步主內存,線程B從主內存中讀取變量然後載刷新到線程B的本地內存中,線程A什麼時候去刷新主內存的變量這個是不確定的,線程B什麼時候去同步也是不確定,就導致了線程安全性問題.
volitile可以解決這種可見性問題
1、 對於聲明volitile的變量,在每次進行寫操作的,jmv會向處理器發送一條Lock前綴的指令,會把這個變量所在的緩存行數據 寫回系統內存中。
2、在多處理器的情況下,保證每個處理器緩存一致性的特點,就會實現緩存一致性協議。
3、多處理器會監聽到主內存中的變量是否發生變化,查看自己緩存的值是否過期了,設置失效,重新從主存中讀取。
但是會出現複合性問題
Volatile int i = 0;
public void update(){
i++;
}
I++涉及到三個步驟,所以會有併發問題。
syschronized主要是實現一個鎖的機制
使用monitor進行加鎖,如果沒有獲取到鎖的線程會放進一個queue裏,進行再次獲取鎖。