我的原则:先会用再说,内部慢慢来
Object.wait
一、 作用
- wait 的作用是啥:让出当前锁住的对象,让别的线程跑完再来弄我的线程。
二、 注意点
- 记住锁是锁对象,不是锁住线程
- Join 方法是 Thread对象的,wait方法是 Object 对象的,Join的底层实现是 wait
- wait方法的使用必须在同步的范围内,否则就会抛出 IllegalMonitorStateException 异常.
- wait方法的作用就是阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒。
- 底层就是 ObjectMonitor 对象释放了当前对象A,丢到 waitSet 区域去,然后重新锁住了其他的对象。
三、demo
万物皆对象,人在做天在看。线程Thread 在抢锁,ObjectMonitor在看。
代码:
public class _02_00_WaitTest {
// 注意这里的 synchronzied,待会去掉。
public synchronized void testWait(){
System.out.println(Thread.currentThread().getName() + ", Start-----");
try {
wait(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ", End-------");
}
public static void main(String[] args) throws Exception{
final _02_00_WaitTest test = new _02_00_WaitTest();
System.out.println("Main begin...");
Thread.sleep(200); // 停顿的目的都是为了保证打印的顺序
new Thr