首頁常見問題正文

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

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

IT培訓(xùn)班

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

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

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

  下面是一個(gè)簡單的代碼演示:

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;
    }
}

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

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

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

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

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

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!