我正在尝试运行其run()方法具有for循环的线程,只有在使用sleep()时才会跳过某些循环。任何人都可以解释原因吗?

时间:2017-10-09 00:48:36

标签: java multithreading loops

我正在尝试运行四个线程。 run()方法有一个for循环循环10次。在每个循环中,共享资源“x”增加1.当所有线程都死掉时,for循环应该运行4x10 = 40次,x值应该等于40。 / p>

在我的代码的所有运行中都没有发生这种情况。每次运行代码时,它都会输出不同的x值。大部分x的输出值范围从33到40。

为什么每次跑步都不是40?这是否意味着某些循环循环被跳过?这是由于被阻止造成的吗?

注意:删除sleep()时不会发生这种情况。它每次打印40个。

我的代码:

    public class MyThreadImplementsRunnable implements Runnable{

        int x =0;

        public void run() {

            for(int i=0;i<10;i++){
            x = x+1;

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {

                System.out.println("exception");
                e.printStackTrace();
            }
            }
        }



        public static void main(String[] args) {

            MyThreadImplementsRunnable m = new MyThreadImplementsRunnable();
            Thread t1 = new Thread(m,"first");
            Thread t2= new Thread(m,"second");
            Thread t3= new Thread(m,"third");
            Thread t4= new Thread(m,"fourth");
            t1.start();
            t2.start();
            t3.start();
            t4.start();

            //To make sure not to go the next statement unless all threads die
            while(t1.isAlive()|| t2.isAlive()|| t3.isAlive()||t4.isAlive()){
            }

            //After all threads die
            System.out.println("now all threads are dead");
            //value of the shared resource x after all threads exit
            System.out.println(m.x);



        }

}

某些测试运行给出了以下结果:

    Output:
    now all threads are dead
    34
    Output:
    now all threads are dead
    33

2 个答案:

答案 0 :(得分:0)

x = x + 1从内存加载x的值,向其添加1,然后将其存储在x中。让我们说线程t1加载30并且同时线程t2加载30它们都以30递增1并且存储31在x而不是32。

为什么它总是40不睡觉可能是由许多事情造成的,我假设它是由每个线程非常快地运行并在下一个线程开始之前完成而引起的。

您也不使用volatile并且存在可见性问题,但目前暂不提及。如果您想编写多线程代码,这也是您需要学习的内容。

答案 1 :(得分:0)

您正在线程之间使用共享资源(x),这会限制数据竞争,可见性等许多问题。您的答案将始终不同

@oleg我认为Volatile在这种情况下无济于事