wait, notify, notyfyAll 都是Object里面的方法,每个Object其实自身都带有一个隐形锁。
一般wait和notify都是要配合synchronized一起使用的
假设线程A执行一下代码,首先获得test的锁,然后test调用wait方法(在线程A中调用wait方法的时候,线程A会释放test的锁)
String test = "";
synchronized( test ){
test.wait();
//do something
}
这时候线程B获得了线程的锁,并调用了test的notify方法,然后睡眠1s,此时线程A只是被唤醒了,但是并不能do something,因为线程B还没有释放掉test的锁,所以此时线程A进入了竞争test的锁的状态。直到线程A获得了test的锁,线程A才能继续do something
synchronized( test ){
test.notify();
Thread.sleep(1000);
}
如果理解了上面的东西,那么对于notifyAll方法就简单了,就是唤醒所有的调用test.wait()方法的线程,并让唤醒的线程进入竞争test锁的状态。当有一个线程争夺到锁,那么其他线程继续等待并争夺锁。