2 qq 30137777 qq_30137777 于 2016.03.19 10:07 提问

关于线程不同步执行的问题
 public class TestSynchronous implements Runnable{
    Timer timer = new Timer();
    public static void main(String[] args){
        TestSynchronous test = new TestSynchronous();
        Thread t1 = new Thread(test);
        Thread t2 = new Thread(test);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
    }

    public void run(){
        timer.add(Thread.currentThread().getName());
    }
}

class Timer{
    private static int num = 0;
    public void add(String name){
        num++;
        try{
            Thread.sleep(1);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println(name+": " +"是第"+num+"线程");
    }
}

第一次在命令行编译执行时是这样:
图片说明
随着执行次数的增加,有时候输出变成这样了:
图片说明
下面这个图是总的执行次数,可以看出,有一个num输出为1:
图片说明

1个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.19 10:18

由于num是静态共享变量,但是同时被多个线程访问,所以必须对其作同步控制,修正你的Timer的add方法,把num++放在同步互斥代码块中保证同一时刻只能有一个线程对其修改,修改版如下:

synchronized(Timer. class){num++;}

wojiushiwo945you
wojiushiwo945you 你是两个线程同时都在调用num方法,同时读到1时,有一个线程先行修改了。如果需要一致的话,还应该把打印语句也放入同步块中。
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
qq_30137777
qq_30137777 我知道要放在同步互斥代码中对其进行限制,我这段代码是还没写到同步这里,这个代码按理说,出来的num应该都是2,怎么会有1呢?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!