java voliate關(guān)鍵字
volatile
是 Java 中的關(guān)鍵字,用于修飾變量,以確保在多線程環(huán)境下的可見(jiàn)性和有序性。使用 volatile
關(guān)鍵字修飾的變量,會(huì)告訴編譯器和 JVM 該變量可能被多個(gè)線程同時(shí)訪問(wèn),從而避免一些并發(fā)問(wèn)題。
volatile
關(guān)鍵字的主要作用是:
可見(jiàn)性: 當(dāng)一個(gè)線程修改一個(gè)被
volatile
修飾的變量的值時(shí),這個(gè)修改對(duì)其他線程是立即可見(jiàn)的。這是因?yàn)槭褂?volatile
關(guān)鍵字會(huì)告訴 JVM 不要將該變量緩存在線程的本地內(nèi)存中,而是每次都從主內(nèi)存中讀取最新的值。禁止指令重排序: 使用
volatile
關(guān)鍵字還會(huì)禁止編譯器和 JVM 對(duì)指令進(jìn)行重排序,從而確保讀寫操作的順序不會(huì)被改變。
盡管 volatile
關(guān)鍵字能夠提供可見(jiàn)性和有序性的保證,但它并不能解決所有的并發(fā)問(wèn)題。例如,它不能代替鎖來(lái)實(shí)現(xiàn)復(fù)雜的同步操作,也不能用來(lái)保證復(fù)合操作的原子性。在使用 volatile
時(shí)需要注意一些限制和適用場(chǎng)景,以確保正確性和性能。
以下是一個(gè)簡(jiǎn)單的示例,展示了如何使用 volatile
關(guān)鍵字來(lái)確保變量的可見(jiàn)性:
public class VolatileExample {
? ? private volatile boolean flag = false;
? ? public void toggleFlag() {
? ? ? ? flag = !flag;
? ? }
? ? public boolean isFlag() {
? ? ? ? return flag;
? ? }
? ? public static void main(String[] args) {
? ? ? ? VolatileExample example = new VolatileExample();
? ? ? ? Thread writerThread = new Thread(() -> {
? ? ? ? ? ? example.toggleFlag();
? ? ? ? ? ? System.out.println("Flag is toggled.");
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? Thread.sleep(1000);
? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? Thread readerThread = new Thread(() -> {
? ? ? ? ? ? while (!example.isFlag()) {
? ? ? ? ? ? ? ? // Busy-wait until the flag becomes true
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println("Flag is true.");
? ? ? ? });
? ? ? ? writerThread.start();
? ? ? ? readerThread.start();
? ? }
}
在上述示例中,flag
變量被聲明為 volatile
,確保在一個(gè)線程修改 flag
后,另一個(gè)線程可以立即看到修改的結(jié)果。