notify方法:
notifyAll()方法:
看完上面的注释我们可以总结以下的要点:
- 无论是wait、notify还是notifyAll()都需要由监听器对象(锁对象)来进行调用
- 简单来说:他们都是在同步代码块中调用的,否则会抛出异常!
notify()
唤醒的是在等待队列的某个线程(不确定会唤醒哪个),notifyAll()
唤醒的是等待队列所有线程- 导致
wait()
的线程被唤醒可以有4种情况
- 该线程被中断
wait()
时间到了- 被
notify()
唤醒 - 被
notifyAll()
唤醒
- 调用
wait()
的线程会释放掉锁
其实总结完上面的并不会有比较深刻的印象,可以尝试着回答几个问题来加深对wait()
和notify()
的理解。
5.1为什么wait和notify在Object方法上?
从一开始我们就说了:wait()
和notify()
是Java给我们提供线程之间通信的API,既然是线程的东西,那什么是在Object类上定义,而不是在Thread类上定义呢?
因为我们的锁是对象锁【要是忘记的同学可回顾:Java锁机制了解一下】,每个对象都可以成为锁。让当前线程等待某个对象的锁,当然应该通过这个对象来操作了。
- 锁对象是任意的,所以这些方法必须定义在Object类中
5.2notify方法调用后,会发生什么?
上面已经说了,notify会唤醒某个处于等待队列的线程。
但是要注意的是:
- notify方法调用后,被唤醒的线程不会立马获得到锁对象。而是等待notify的synchronized代码块执行完之后才会获得锁对象
5.3sleep和wait有什么区别?
Thread.sleep()
与Object.wait()
二者都可以暂停当前线程,释放CPU控制权。
- 主要的区别在于
Object.wait()
在释放CPU同时,释放了对象锁的控制。 - 而
Thread.sleep()
没有对锁释放
参考资料:
- https://blog.csdn.net/lingzhm/article/details/44940823
- http://www.cnblogs.com/dolphin0520/p/3920385.html
- https://www.cnblogs.com/eer123/p/7880789.html
- https://www.jianshu.com/p/f4454164c017
六、finalize()方法
finalize()
方法将在垃圾回收器清除对象之前调用,但该方法不知道何时调用,具有不定性
- 一般我们都不会重写它~
一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。
参考资料:
进阶的资料:
- https://www.cnblogs.com/Smina/p/7189427.html
- http://www.importnew.com/23913.html
- https://zhuanlan.zhihu.com/p/29522201
- https://zhuanlan.zhihu.com/p/25698745
七、总结
总的来说也算是把Object看了一遍了,不至于一下子把它的方法给忘了~~~在学习的过程中也遇到过问题,最明显的是对protected修饰符又加深了一次理解。
参考资料:
- 《Java核心技术卷一》