the code:
public class NotifyAndWaitTest2 implements Runnable {
public int i = 0;
public Object lock;
public SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
public NotifyAndWaitTest2(Object o) {
this.lock = o;
}
@Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " enter the SYNCHRONIZED block --- "+ sdf.format(new Date()));
try {
while (i < 9) {
Thread.sleep(500);
lock.notify();
lock.wait();
System.out.println(Thread.currentThread().getName() + " say:" + i++ + " --- " + sdf.format(new Date()));
}
lock.notify();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Object lock = new Object();
NotifyAndWaitTest2 test = new NotifyAndWaitTest2(lock);
Thread t1 = new Thread(test,"Thread A");
Thread t2 = new Thread(test,"Thread B");
Thread t3 = new Thread(test,"Thread C");
Thread t4 = new Thread(test,"Thread D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
the result:
Thread A enter the SYNCHRONIZED block --- 10:47:07.242
Thread B enter the SYNCHRONIZED block --- 10:47:07.743
Thread C enter the SYNCHRONIZED block --- 10:47:08.243
Thread D enter the SYNCHRONIZED block --- 10:47:08.743
Thread C say:0 --- 10:47:09.243
Thread D say:1 --- 10:47:09.744
Thread C say:2 --- 10:47:10.244
Thread D say:3 --- 10:47:10.744
Thread C say:4 --- 10:47:11.245
Thread D say:5 --- 10:47:11.745
Thread C say:6 --- 10:47:12.246
Thread D say:7 --- 10:47:12.746
Thread C say:8 --- 10:47:13.247
Thread D say:9 --- 10:47:13.247
Thread B say:10 --- 10:47:13.247
Thread A say:11 --- 10:47:13.247
The code executes the same result in both jdk1.7 and jdk1.8.
my problem:
After thread A and thread B enter SYNCHRONIZED block and call the wait() method, why is thread C and thread D entering instead of thread A say i and then thread B say i? Is the priority of entering the sync block higher than the thread that just called wait() method?
Why called notify() method just wake up the lastest thread that called wait() method? just like the thread C and thread D, notify each other and wait for each other, why not any other waiting thread? like thread A and thread B.
I think it should be random, like
Thread A enter the SYNCHRONIZED block
Thread B enter the SYNCHRONIZED block
Thread A say:0
Thread C enter the SYNCHRONIZED block
Thread B say:1
Thread A say:2
Thread D enter the SYNCHRONIZED block
Thread B say:3
Thread C say:4