首頁常見問題正文

synchronized和volatile的區(qū)別是什么?

更新時間:2023-05-18 來源:黑馬程序員 瀏覽量:

IT培訓班

  synchronized和volatile都可以用于多線程編程,但它們的作用不同。

  volatile變量用于保證線程之間對變量的可見性,即當一個線程修改了一個volatile變量時,其他線程能夠立即看到這個變量的最新值。volatile關鍵字通常用于修飾被多個線程訪問的共享變量,防止出現(xiàn)線程之間的數(shù)據(jù)不一致問題。

  synchronized則是用于實現(xiàn)線程間的互斥同步,即同一時間只允許一個線程訪問某個代碼塊或方法。通過 synchronized關鍵字的作用,可以保證在同一時刻只有一個線程執(zhí)行被鎖定的代碼塊或方法,從而避免出現(xiàn)多個線程同時修改共享變量造成的數(shù)據(jù)不一致問題。

  下面是一個簡單的代碼演示:

public class SynchronizedVsVolatileDemo {
    private volatile int volatileCounter = 0;
    private int synchronizedCounter = 0;

    public void incrementVolatileCounter() {
        volatileCounter++;
    }

    public synchronized void incrementSynchronizedCounter() {
        synchronizedCounter++;
    }

    public int getVolatileCounter() {
        return volatileCounter;
    }

    public int getSynchronizedCounter() {
        return synchronizedCounter;
    }
}

  在上面的代碼中,我們定義了兩個計數(shù)器變量 volatileCounter 和 synchronizedCounter,分別用 volatile 和 synchronized 進行修飾。incrementVolatileCounter 方法使用 volatile 關鍵字對 volatileCounter 進行遞增操作,incrementSynchronizedCounter 方法使用 synchronized 關鍵字對 synchronizedCounter 進行遞增操作。getVolatileCounter 和 getSynchronizedCounter 方法分別用于獲取這兩個計數(shù)器的值。

  在多線程環(huán)境下,如果我們同時啟動多個線程去調(diào)用這兩個遞增方法,可以觀察到下面的現(xiàn)象:

  ·對于volatileCounter變量,由于它被volatile修飾,因此在遞增操作后,其他線程能夠立即看到這個變量的最新值,從而保證了數(shù)據(jù)的可見性。

  ·對于synchronizedCounter變量,由于它被synchronized修飾,因此在遞增操作時,只有一個線程能夠獲取到鎖并執(zhí)行遞增操作,其他線程需要等待鎖被釋放后才能執(zhí)行遞增操作,從而保證了線程間的互斥同步。

  綜上所述,volatile和synchronized在多線程編程中有著不同的作用,需要根據(jù)實際需求選擇使用。

分享到:
在線咨詢 我要報名
和我們在線交談!