gpt4 book ai didi

java - 线程能够看到java中主线程设置的更新的静态变量

转载 作者:行者123 更新时间:2023-12-01 08:02:10 24 4
gpt4 key购买 nike

您能否澄清一下代码有什么问题:

问:尽管我没有将信号灯声明为 volatile ,但线程 t1 能够看到主线程设置的更新值(true)......

代码:

package com.learning;
public class HowToStopRunningThread implements Runnable{
/**
* @param args
*/
public static boolean blinker;

public static void main(String[] args) {
Thread t = new Thread(new HowToStopRunningThread());
t.start();
HowToStopRunningThread obj = new HowToStopRunningThread();
obj.stop();
}

public void stop(){
try{
Thread.sleep(100);
System.out.println(“Setting the Blinker value”);
blinker = true;
}catch(InterruptedException ie){
ie.getMessage();
}
}


@Override
public void run() {
while(!blinker){
try{
System.out.println(“blinker:”+blinker);
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.getMessage();
}
}
}
}

输出:

blinker:false
Setting the Blinker value

——————————然后线程从 while 循环中出来

最佳答案

volatile 保证新值对其他线程可见。但这并不意味着对非 volatile 变量的更改保证是不可见的。

简而言之,这是偶然发生的,并且不能保证始终随处有效。

在这种情况下,它当然可以工作,因为两个线程都打印到 System.out,而 println 是一个同步方法。同步还提供可见性保证。

关于java - 线程能够看到java中主线程设置的更新的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24568749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com