スレッドの揮発性キーワード


揮発性の役割

複数のスレッド間で変数を表示します

素人の言葉で言えば、スレッドAがvolatileキーワードによって変更された変数を変更すると、その変数は他のスレッドに表示されますつまり、スレッドが変数を取得するたびに変数の値が更新されます


シナリオ1(通常のクラスメソッドの呼び出し)

/**
 * 测试volatile关键字
 * @author layman
 */
public class Demo09 {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        Demo09Service service = new Demo09Service();
        //死循环
        service.doSomething(); 
        System.out.println(Thread.currentThread().getName()+" 线程准备停止doSomething方法");
        service.isContinue = false;
    }
}
class Demo09Service extends  Thread{
    
    
    public boolean isContinue = true;

    @Override
    public void run() {
    
    
        doSomething();
    }
    public void doSomething(){
    
    
        System.out.println("doSomething方法执行开始----");
        while(isContinue){
    
    
        }
        System.out.println("doSomething方法执行结束----");
    }
}

運転結果

ここに画像の説明を挿入

結論として

メインスレッドはservice.doSomething()メソッドでスタックしており、実行を継続する時間がありません。


シナリオ2(スレッドによって呼び出されます)

public class Demo09 {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        Demo09Service service = new Demo09Service();
        //会正常停止,但是如果加上Thread.sleep(100); 就会进入死循环
        service.start();
        //Thread.sleep(100);
        System.out.println(Thread.currentThread().getName()+" 线程准备停止doSomething方法");
        service.isContinue = false;
    }
}
class Demo09Service extends  Thread{
    
    
    public boolean isContinue = true;

    @Override
    public void run() {
    
    
        doSomething();
    }
    public void doSomething(){
    
    
        System.out.println("doSomething方法执行开始----");
        while(isContinue){
    
    
	     
        }
        System.out.println("doSomething方法执行结束----");
    }
}

運転結果

ここに画像の説明を挿入

結論として

  • この時点では正常に停止できますが、その理由は、スレッドがwhileループに入っていないときにisContinueの値がfalseに変更されたためです(whileループに簡単なprintステートメントを追加することでテストできます)
  • コメントThread.sleep(100);を手放すと、再び無限ループに入ります。
  • ここに画像の説明を挿入

シナリオ3(スレッドによって呼び出され、volatileで変更されました)

package com.hanyxx.thread;
/**
 * 测试volatile关键字
 * @author layman
 * @date 2021/2/6
 */
public class Demo09 {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        Demo09Service service = new Demo09Service();
        service.start();
        Thread.sleep(100);
        System.out.println(Thread.currentThread().getName()+" 线程准备停止doSomething方法");
        service.isContinue = false;
    }
}
class Demo09Service extends  Thread{
    
    
    public volatile boolean isContinue = true;

    @Override
    public void run() {
    
    
        doSomething();
    }
    public void doSomething(){
    
    
        System.out.println("doSomething方法执行开始----");
        while(isContinue){
    
    
        }
        System.out.println("doSomething方法执行结束----");
    }
}

運転結果

ここに画像の説明を挿入

総括する

ここに画像の説明を挿入

推奨ブログ:https
//blog.csdn.net/tianjindong0804/article/details/105134458

おすすめ

転載: blog.csdn.net/single_0910/article/details/113705851