синхронизированный метод при использовании wait()

Я запустил следующий код:

class Counter extends Thread {

 static int i=0;
//method where the thread execution will start
public void run(){
    //logic to execute in a thread

    while (true) {
        increment();
    }
}

public synchronized void increment()  {
    try {
        System.out.println(this.getName() + " " +  i++);
        wait(1000);
        notify();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
//let’s see how to start the threads
public static void main(String[] args){
    Counter c1 = new Counter();
    Counter c2 = new Counter();
    c1.setName("Thread1");
    c2.setName("Thread2");
    c1.start();
    c2.start();
}
}

Результат этого кода был (добавлены номера строк):

1: Thread1 0
2: Thread2 1
3: Thread2 2
4: Thread1 3
5: Thread2 4
6: Thread1 4
7: Thread1 5
8: Thread2 6
stopping...

Поскольку метод приращения синхронизирован, и, поскольку он содержит ожидание (1000), я не ожидал: 1. Thread2 для печати 2 последовательных отпечатков: строки 2,3 Я ожидал, что нити будут чередовать свои отпечатки 2. в строках 5,6 i остается 4.

кто-нибудь может мне объяснить это?

5
задан keyser 19 May 2012 в 13:23
поделиться