一、notify的含义(视为使当前线程获取对象锁并于规定一定条件下释放的方法)
(1)notify一次只随机通知一个线程进行唤醒(notifyAll则为全部)
(2) 在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁,
要等到执行notify方法的线程将程序执行完 ,也就是退出sychronized代码块后,当前线程才会释放锁,
而呈wait状态所在的线程才可以获取该对象锁。
对象锁释放的三种情况
序号场景
1、执行完同步代码块就会释放对象的锁
2、在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
3、在执行同步代码块的过程中,执行了锁所属对象的wait方法,这个线程会提前释放对象锁,而此线程对象会进入线程等待池中,等待被唤醒(阻塞),直到等到到下一个notify将锁给他,才开始执行最后一个wait后面剩余的代码。
二,wait的含义(视为使当前线程马上释放对象锁并阻塞的方法)
(1)将当前进程挂起,等待唤醒
(2)wait( )会先释放锁住的对象,然后再执行挂起的动作。参见以上第3点
三、为什么wait方法与notify方法要用synchronized保证同步
1. 正如Java内任何对象都能成为锁(Lock)一样,任何对象也都能成为条件队列(Condition queue)。而这个对象里的wait(), notify()和notifyAll()则是这个条件队列的固有(intrinsic)的方法。
2.一个对象的固有锁和它的固有条件队列是相关的,为了调用对象X内条件队列的方法,你必须获得