關於volatile和synchronized的理解.

首先我們先看一下每個線程對應我們內存的模型。

 

每個線程都有一個私有的本地內存,存儲共享變量的副本,從主內存獲取到數據。

線程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裏,進行再次獲取鎖。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章