スレッドの揮発性キーワード
揮発性の役割
複数のスレッド間で変数を表示します。
素人の言葉で言えば、スレッド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