更新時(shí)間:2023-05-18 來(lái)源:黑馬程序員 瀏覽量:
synchronized和volatile都可以用于多線(xiàn)程編程,但它們的作用不同。
volatile變量用于保證線(xiàn)程之間對(duì)變量的可見(jiàn)性,即當(dāng)一個(gè)線(xiàn)程修改了一個(gè)volatile變量時(shí),其他線(xiàn)程能夠立即看到這個(gè)變量的最新值。volatile關(guān)鍵字通常用于修飾被多個(gè)線(xiàn)程訪(fǎng)問(wèn)的共享變量,防止出現(xiàn)線(xiàn)程之間的數(shù)據(jù)不一致問(wèn)題。
synchronized則是用于實(shí)現(xiàn)線(xiàn)程間的互斥同步,即同一時(shí)間只允許一個(gè)線(xiàn)程訪(fǎng)問(wèn)某個(gè)代碼塊或方法。通過(guò) synchronized關(guān)鍵字的作用,可以保證在同一時(shí)刻只有一個(gè)線(xiàn)程執(zhí)行被鎖定的代碼塊或方法,從而避免出現(xiàn)多個(gè)線(xiàn)程同時(shí)修改共享變量造成的數(shù)據(jù)不一致問(wèn)題。
下面是一個(gè)簡(jiǎn)單的代碼演示:
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)鍵字對(duì) volatileCounter 進(jìn)行遞增操作,incrementSynchronizedCounter 方法使用 synchronized 關(guān)鍵字對(duì) synchronizedCounter 進(jìn)行遞增操作。getVolatileCounter 和 getSynchronizedCounter 方法分別用于獲取這兩個(gè)計(jì)數(shù)器的值。
在多線(xiàn)程環(huán)境下,如果我們同時(shí)啟動(dòng)多個(gè)線(xiàn)程去調(diào)用這兩個(gè)遞增方法,可以觀察到下面的現(xiàn)象:
·對(duì)于volatileCounter變量,由于它被volatile修飾,因此在遞增操作后,其他線(xiàn)程能夠立即看到這個(gè)變量的最新值,從而保證了數(shù)據(jù)的可見(jiàn)性。
·對(duì)于synchronizedCounter變量,由于它被synchronized修飾,因此在遞增操作時(shí),只有一個(gè)線(xiàn)程能夠獲取到鎖并執(zhí)行遞增操作,其他線(xiàn)程需要等待鎖被釋放后才能執(zhí)行遞增操作,從而保證了線(xiàn)程間的互斥同步。
綜上所述,volatile和synchronized在多線(xiàn)程編程中有著不同的作用,需要根據(jù)實(shí)際需求選擇使用。