volatile關鍵字

volatile關鍵字的意思是要讓共享及時通知java

多個線程同時共享lock變量。緩存

源於JMM  JAVA 內存模型中的線程的【工做內存】+【主內存】相似於真實CPU的【緩存】+【內存】ide

多個線程共享變量  a,則每一個每一個線程都會在本身的工做內存中保留一份副本!這就會帶來多個工做內存之間的副本在本身讀寫的時候,會致使不一致!線程

一、加了volatile修飾的變量,若是有一個線程對其進行寫操做,code

A、強制其必定要刷新寫到主內存中!內存

B、其餘線程工做內存中的副本都會失效!必須到主內存中去從新獲取,刷新!io

C、這樣就保證了共享變量內存的及時可見性!class

1、如下是使用volatile修飾共享變量(這裏當作信號量)變量

public class Test {
    private volatile int lock = 1;
    public void volatileTest() {
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                int n = 0;
                while (lock == 1){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("T1--"+ n++ +":runnable is running...");
                }
                System.out.println("T1--"+ n+":runnable is run out...");
            }
        };
        Runnable runnable2 = new Runnable() {
            @Override
            public void run() {
                int n = 0;
                while (lock == 1){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("T2--"+ n++ +":runnable is running...");
                }
                System.out.println("T2--"+ n+":runnable is run out...");
            }
        };
        Runnable runnable3 = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("我要中斷你!!!!");
                    lock = 0;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread t1 =  new Thread(runnable1);
        Thread t2 =  new Thread(runnable2);
        Thread t3 =  new Thread(runnable3);
        t1.start();
        t2.start();
        t3.start();
    }
}

結果以下:while

T2--0:runnable is running...
T1--0:runnable is running...
T2--1:runnable is running...
T1--1:runnable is running...
我要中斷你!!!!
T2--2:runnable is running...
T1--2:runnable is running...
T1--3:runnable is run out...
T2--3:runnable is run out...
相關文章
相關標籤/搜索