java多线程与并发的线程之间通信的问题

既然每个线程有自己的工作内存为什么我执行下面代码的时候主内存变量的更改能够影响线程
为什么会执行到 System.out.println(num+"*****************线程终止************");
还有为什么我把System.out.println(num);一行注释掉就永远停止不了了
那么Java到底在什么时间执行read和load、store和write

 public class CourrTest02 extends Thread{
    private static long num=0;
    private  boolean a=true;
   @Override
    public void run() {
       while(num!=10001){
    //  
        System.out.println(num);
           }

       System.out.println(num+"*****************线程终止************");
    }

public static void main(String[] args) throws InterruptedException {
    boolean b=true;
    CourrTest02 c1=new CourrTest02();

    c1.start();
    Thread.sleep(1000);

    for(int i=0;i<10000;i++){
        c1.num=10001;

    }

}

}

3个回答

我觉得吧。你确实写的是c1.num = 10001。而且num定义的位置确实应该会影响到线程的运行吧。
至于为什么注掉了System.out.println(num)会导致停步下来。我觉得可能和线程抢占有关吧。在打印的时候会阻塞这个线程,就会执行到c1.num= 10001。
-- 才疏学浅,就能分析这么多了。

为什么会执行到 System.out.println(num+"*****************线程终止************");
因为num对于以上两个线程都是共享的,主线程的c1.num=10001;会作用到子程序中去。
还有为什么我把System.out.println(num);一行注释掉就永远停止不了了
至于这个问题,主要是对while(num!=10001)的优化导致,如果将num改成volatile或加System.out.println("num!=10001");就照样会停下来

rexandlee
school-boy 线程应该是在进行read,load 以后一直执行count++一直到执行完毕,再执行store and write 把工作内存数据刷到主内存中吗?
3 年多之前 回复
rexandlee
school-boy num对于以上两个线程是共享的,但是不是每一个线程都有工作内存吗,每一个线程的工作内存都会拷贝一份到自己的私有内存中把,那么在执行count++应该是使用的线程私有内存的值吧,还有我不理解的是:
3 年多之前 回复

java线程是不可控制的,除非你停掉当前程序,有可能会停止,你只能控制它的执行内容不能控制它执行的时间

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问