1. 程式人生 > >多執行緒關於volatile關鍵字的問題

多執行緒關於volatile關鍵字的問題

最近在學習多執行緒的問題,在學到volatile關鍵字的時候遇到了一個問題,請有緣人幫我解答...

上程式碼:

這是執行緒類;

package cn.whu.javaBasic.Thread.Test18;

public class Service {
    //volatile   //此處註釋與否結果不一樣,符合volatile關鍵字的用法
    private   boolean isRun;

    public Service(boolean isRun){
        this.isRun = isRun;
    }

    public void run(){

        while(isRun){
            //System.out.println("is running...");
        }
        System.out.println("stoped...");
    }

    public void stop(){
        isRun=false;
    }
}

class ThreadA extends Thread{
    private Service service;

    public ThreadA(Service service){
        this.service = service;
    }

    @Override
    public void run() {
        super.run();
        service.run();
    }
}

class ThreadB extends Thread{
    private Service service;

    public ThreadB(Service service){
        this.service = service;
    }

    @Override
    public void run() {
        super.run();
        service.stop();
    }
}

這是程式入口;

package cn.whu.javaBasic.Thread.Test18;

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        Service service = new Service(true);
        ThreadA threadA = new ThreadA(service);
        ThreadB threadB = new ThreadB(service);
        threadA.start();
        Thread.sleep(2000);
        threadB.start();
        System.out.println("has already stopped...");
    }
}

有兩個地方需要注意一下:

1,isRun屬性前加volatile關鍵字時,程式執行結果:

D:\software\develop\JDK\bin\java "...

//兩秒後打印出來
has already stopped...
stoped...

Process finished with exit code 0

沒加volatile關鍵字程式執行結果:

D:\software\develop\JDK\bin\java ...
has already stopped...

程式沒有停下來。

這個地方的原理不懂的可以查一下volatile關鍵字作用,此處不詳述。

2,Service類的run()方法的while迴圈中,

public void run(){

        while(isRun){
            //System.out.println("is running...");
        }
        System.out.println("stoped...");
    }

System.out.println(i);這段程式碼新增與否對程式執行結果有重大影響:

一下兩種情況都未在isRun屬性前加volatile關鍵字。

註釋了的情況:

D:\software\develop\JDK\bin\java ...
has already stopped...

程式陷入死迴圈無法停止。

未註釋的情況:

is running...
is running...
is running...
has already stopped...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
is running...
stoped...

Process finished with exit code 0

程式執行結束了。

這個結果實在想不通,有沒有高人解答......