不期望多线程程序输出

时间:2012-01-03 23:59:04

标签: java multithreading

多线程

public class RaceData {

public static void main(String[] args) {

    class UnsafeSequence implements Runnable{
        private int value = 0;

        /** Returns a unique value. */

        public void run(){

            synchronized (this) {
                value = value +1;
                System.out.printf("Thread %s and Count value is %d \n",Thread.currentThread().getName(),value);
            }
        }
    }

    UnsafeSequence s = new UnsafeSequence();
    Thread t1 = new Thread(s);
    t1.setName("t1");
    t1.start();
    Thread t2 = new Thread(s);
    t2.setName("t2");
    t2.start();
    Thread t3 = new Thread(s);
    t3.setName("t3");
    t3.start();
    Thread t4 = new Thread(s);
    t4.setName("t4");
    t4.start();
    Thread t5 = new Thread(s);
    t5.setName("t5");
    t5.start();     
}
}

输出是:

Thread t1 and Count value is 1 
Thread t5 and Count value is 2 
Thread t3 and Count value is 3 
Thread t4 and Count value is 4 
Thread t2 and Count value is 5 

为什么计数值无法正确显示? 对不起,我正在修改我的问题,这不是关于计数变量值, 我预计线程t2会在t1之后执行,因为我在t1之后开始了t2, 这里的线程没有被执行,虽然我一个接一个地开始执行。

4 个答案:

答案 0 :(得分:5)

count 正确显示。每次线程访问synchronized块时,count都会递增。

您不能指望线程以与它们开始时相同的顺序访问synchronized块。

答案 1 :(得分:1)

它们没有按照您期望的顺序执行,因为虽然实际打印是通过同步线程完成的,但不能保证各个线程将同时到达(并等待轮到他们)。

所有synchronized保证块一次由1个线程运行。

答案 2 :(得分:1)

启动线程的顺序并不能保证它们的执行方式。说,你开始了3个线程,T1,T2,T3。一旦调用T1.start(),T2.start()和T3.start(),所有线程都会移动到一个名为runnable的状态,这意味着等待CPU执行。 CPU随机选择这些线程中的任何一个并执行它们。这是并发编程的风险之一,默认情况下,执行顺序是随机的。

答案 3 :(得分:0)

“value”对于UnsafeSequence类是私有的,您只有一个实例。每次run()在不同的线程中执行时,值都会递增并打印。输出与我的预期一致。