package test2;
/**
@author liuyu
*
*/
public class Test {
private int i ;
private synchronized void inc(){
i ++;
System. out .println(Thread.currentThread().getName()+ "--inc--" + i );
}
private synchronized void dec(){
i --;
System. out .println(Thread.currentThread().getName()+ "--dec--" + i );
}
class Inc implements Runnable {
public void run() {
inc();
}
}
class Dec extends Thread{
public void run() {
dec();
}
}
public static void main(String[] args) {
Test t = new Test();
Inc inc = t. new Inc();
Thread thread = null;
// 創建 2 個增加線程
for ( int i = 0; i < 2; i++) {
thread = new Thread(inc);
thread.start();
}
// 創建 2 個減少線程
for ( int i = 0; i < 2; i++) {
thread = t.new Dec();
thread.start();
}
}
}
輸出:Thread-0--inc--1
Thread-3--dec--0
Thread-2--dec---1
Thread-1--inc--0
可是我感覺應該輸出是:
Thread-0--inc--1
Thread-1--inc--2
Thread-2--dec--1
Thread-3--dec--0
因為按照執行順序,當執行第一個for循環第一次的時候創建第一個線程,並且i加1,執行第二次for循環的時候i再加1等於2;
執行第二個for循環的時候,創建第三個線程,並且i減1,執行第二次的後事i再減1等於0
為什麼不對呢?
鹵煮的想法沒錯,程序確實是一步一步從上往下執行的,也創建了四個線程,之所以沒有出現預期的結果,可能是有一點被忽略了,java中的線程有自己的生命周期,一個新的線程會經歷創建、就緒然後才能進入執行狀態。也就是說你的程序創建了四個線程,它們只是進入了就緒狀態,等待cpu線程棧的調度,而何時可以得執行以及執行的順序還要依賴cpu的性能、cpu的個數等等。所以程序的輸出結果應該是未知的,鹵煮可以多跑幾次,應該會輸出不同內容。嘿嘿。