多线程
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, 这里的线程没有被执行,虽然我一个接一个地开始执行。
答案 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()在不同的线程中执行时,值都会递增并打印。输出与我的预期一致。