synchronized與volatile異同分析

synchronized用來對線程進行同步,在變量操作上來說,他有着和volatile相近的特性,那就是一個線程寫入的數據

在其他線程眼裏所看到的都是同一份數據。這就屏蔽了線程各自緩存的數據和主存數據不一致的影響。

但是他們2個也有不同的地方,那就是如果當前寫入數據的值需要基於變量的前一個值時,volatile就會失效。

比如n = n+1; n++這種操作

他們並不是原子性的操作,首先你需要先把數據讀出來,再加一,再寫回去。

如果變量僅僅是通過volatile聲明的話就會出現數據不一致的現象。如下面的程序

volatile int n = 0;
for(int i=0; i<10; i++)
{
       new Runnable( void run(){n++;}).start();
}
System.out.println(n);

這時候輸出的n不一定就是10,可能是7 8 9等值。

這時候就需要用synchronized來對線程進行同步操作,保證數據的一致性。



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